/ Hex Artifact Content
Login

Artifact 9e6d189894f54744d1a20c63de5afb66342f0904:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20   aSpace[200];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
5b00: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
5b10: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ld==0 ){.      s
5b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
5b30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
5b40: 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72   pFree);.      r
5b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
5b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
5b80: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
5b90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5ba0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5bb0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
5bc0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
5bd0: 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  );.  if( pFree )
5be0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5bf0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5c00: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5c10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5c30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5c40: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5c50: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5c60: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5c70: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5c80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5c90: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5ca0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5cb0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5cc0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5cd0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5ce0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5cf0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5d00: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5d10: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5d20: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5d30: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
5d40: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5d50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5d70: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5d80: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5d90: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5da0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5db0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5dc0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5dd0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5de0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5df0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
5e00: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5e10: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
5e20: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
5e30: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
5e40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5e50: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
5e60: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
5e70: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
5e80: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70  Cur->nKey, 0, &p
5e90: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a  Cur->skipNext);.
5ea0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5eb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5ec0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5ed0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5ee0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5ef0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5f00: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5f10: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
5f20: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
5f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
5f40: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
5f50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5f60: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5f70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f80: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
5f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
5fb0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
5fc0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
5fd0: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
5ff0: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
6000: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6010: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
6020: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
6030: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
6040: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
6050: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
6060: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
6070: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
6080: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
6090: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
60a0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
60b0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
60c0: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
60d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
60e0: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
60f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6100: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
6110: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6120: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
6130: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
6140: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
6150: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
6160: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
6170: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
6180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6190: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
61a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
61b0: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
61c0: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
61d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
61e0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
61f0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
6200: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
6210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6220: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6230: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
6240: 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b  | NEVER(pCur->sk
6250: 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20  ipNext!=0) ){.  
6260: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
6270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6280: 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  pHasMoved = 0;. 
6290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
62a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
62b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
62c0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
62d0: 2a 20 47 69 76 65 20 61 20 68 69 6e 74 20 74 6f  * Give a hint to
62e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 61 74   the cursor that
62f0: 20 69 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20   it only has to 
6300: 64 65 6c 69 76 65 72 20 72 6f 77 73 20 66 6f 72  deliver rows for
6310: 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 65 78   which.** the ex
6320: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
6330: 73 20 74 72 75 65 2e 20 20 57 69 74 68 69 6e 20  s true.  Within 
6340: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 2c  this expression,
6350: 20 72 6f 77 73 20 6f 66 20 74 68 65 0a 2a 2a 20   rows of the.** 
6360: 63 75 72 73 6f 72 20 61 72 65 20 69 64 65 6e 74  cursor are ident
6370: 69 66 69 65 64 20 62 79 20 45 78 70 72 2e 6f 70  ified by Expr.op
6380: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 77 69 74 68  ==TK_COLUMN with
6390: 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
63a0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  able..**.** This
63b0: 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
63c0: 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 73  ot used by the s
63d0: 74 61 6e 64 61 72 64 20 73 74 6f 72 61 67 65 20  tandard storage 
63e0: 65 6e 67 69 6e 65 20 6f 66 20 53 51 4c 69 74 65  engine of SQLite
63f0: 2e 0a 2a 2a 20 49 74 20 69 73 20 6f 6e 6c 79 20  ..** It is only 
6400: 75 73 65 66 75 6c 20 74 6f 20 61 70 70 6c 69 63  useful to applic
6410: 61 74 69 6f 6e 20 74 68 61 74 20 72 65 70 6c 61  ation that repla
6420: 63 65 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  ce SQLite's buil
6430: 74 2d 69 6e 20 73 74 6f 72 61 67 65 0a 2a 2a 20  t-in storage.** 
6440: 65 6e 67 69 6e 65 20 77 69 74 68 20 74 68 65 69  engine with thei
6450: 72 20 6f 77 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  r own..*/.void s
6460: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6470: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
6480: 70 43 75 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  pCur, int iTable
6490: 2c 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45  , const Expr *pE
64a0: 78 70 72 29 7b 0a 20 20 2f 2a 20 41 6c 74 65 72  xpr){.  /* Alter
64b0: 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
64c0: 6e 67 69 6e 65 73 20 6d 69 67 68 74 20 75 73 65  ngines might use
64d0: 20 74 68 69 73 2e 20 2a 2f 0a 7d 0a 23 65 6e 64   this. */.}.#end
64e0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
64f0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
6500: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
6510: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
6520: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6530: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6540: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6550: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6560: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6570: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6580: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6590: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
65a0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
65b0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
65c0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
65d0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
65e0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
65f0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
6600: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
6610: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
6620: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6630: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6640: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6650: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6660: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6670: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6680: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6690: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
66a0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
66b0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
66c0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
66d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
66e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
66f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6700: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6710: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6720: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6730: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6740: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6750: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6760: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6770: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6780: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6790: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
67a0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
67b0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
67c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
67d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
67e0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
67f0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6800: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6810: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6820: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6830: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6840: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6850: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6860: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6870: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6880: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6890: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
68a0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
68b0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
68c0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
68d0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
68e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
68f0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6900: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6920: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6930: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6940: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6950: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6960: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6970: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6980: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6990: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
69a0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
69b0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
69c0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
69d0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
69e0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
69f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6a00: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6a10: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a20: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6a30: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6a40: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6a60: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6a70: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6a80: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6a90: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6aa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6ab0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6ac0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6ad0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6ae0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6af0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6b00: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6b10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6b20: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6b30: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6b40: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6b50: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6b60: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6b70: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6b80: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6b90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6ba0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6bb0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6bc0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6bd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6be0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6bf0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6c00: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6c10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6c20: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6c30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6c40: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6c50: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6c60: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6c70: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6c80: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6c90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6ca0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6cb0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6cc0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6cd0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6ce0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6cf0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6d00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6d10: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
6d20: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6d30: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6d40: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6d50: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6d60: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6d70: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6d80: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6d90: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6da0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6db0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6dc0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6dd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6de0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6df0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6e00: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6e10: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6e20: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6e30: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6e40: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6e50: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6e70: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6e80: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6e90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ea0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6eb0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6ec0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6ed0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ee0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ef0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6f00: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6f10: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6f20: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6f30: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6f40: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6f50: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6f60: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6f70: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6f80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6f90: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6fa0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6fb0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6fc0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6fd0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6fe0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6ff0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
7000: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
7010: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
7020: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7030: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7040: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
7050: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
7060: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
7070: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
7080: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
7090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
70a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
70b0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
70c0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
70d0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
70e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
70f0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7100: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7110: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
7120: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7130: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
7140: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
7150: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7160: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
7170: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7180: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7190: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
71a0: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
71b0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
71c0: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
71d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
71e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
71f0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
7200: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
7210: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
7220: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
7230: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
7240: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
7250: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
7260: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
7270: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
7280: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
7290: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
72a0: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
72b0: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
72c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
72d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
72e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
72f0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
7300: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
7310: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
7320: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7330: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
7340: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7350: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
7360: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
7370: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
7380: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
7390: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
73a0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
73b0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
73c0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
73d0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
73e0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
73f0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
7400: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
7410: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
7420: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7430: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7440: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7450: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7460: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7470: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7480: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7490: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
74a0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
74b0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
74c0: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
74d0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
74e0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
74f0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
7500: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
7510: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
7520: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7530: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7540: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7550: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7560: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7570: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7580: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7590: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
75a0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
75b0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
75c0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
75d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
75e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
75f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
7600: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
7610: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
7620: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7630: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7640: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7650: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7660: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7670: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7680: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7690: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
76a0: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
76b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
76c0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
76d0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
76e0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
76f0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
7700: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
7710: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
7720: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7730: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7740: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7750: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7760: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7770: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7780: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7790: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
77a0: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
77b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
77c0: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
77d0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
77e0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
77f0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
7800: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
7810: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
7820: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7830: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7840: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7850: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7860: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7870: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7880: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7890: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
78a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
78b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
78c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
78d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
78e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
78f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
7900: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
7910: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7920: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7930: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7940: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7960: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7970: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7980: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7990: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
79a0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
79b0: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
79c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
79d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
79e0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
79f0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
7a00: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
7a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7a20: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7a30: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7a40: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7a50: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7a60: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7a70: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7a80: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7a90: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7aa0: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7ab0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 29 3b   assert( n==0 );
7ac0: 0a 20 20 20 20 20 20 6e 20 3d 20 67 65 74 56 61  .      n = getVa
7ad0: 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50  rint32(pCell, nP
7ae0: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7af0: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7b00: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7b10: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7b20: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
7b30: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
7b40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
7b50: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
7b60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
7b70: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
7b80: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7b90: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7ba0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7bb0: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7bc0: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7bd0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7be0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7bf0: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7c00: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7c10: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7c20: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7c30: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7c40: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7c50: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
7c60: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
7c70: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
7c80: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7c90: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7ca0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7cb0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7cc0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7cd0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7ce0: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7cf0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
7d00: 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  ( (pInfo->nSize 
7d10: 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f  = (u16)(n+nPaylo
7d20: 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  ad))<4 ) pInfo->
7d30: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
7d40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7d50: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7d70: 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 0;.  }else{
7d80: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7d90: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
7da0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
7db0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7dc0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
7dd0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7de0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7df0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7e00: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7e10: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7e20: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7e30: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7e40: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7e50: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7e60: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7e70: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7e80: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7e90: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
7ea0: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
7eb0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
7ec0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
7ed0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
7ee0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
7ef0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7f00: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7f10: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7f20: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7f30: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7f40: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7f50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7f60: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7f70: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7f80: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7f90: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7fa0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
7fb0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
7fc0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7fd0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7fe0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
7ff0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
8000: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
8010: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8020: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
8030: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
8040: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
8050: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
8060: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
8070: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
8080: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
8090: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
80a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
80b0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
80c0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
80d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
80e0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
80f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
8100: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
8110: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
8120: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
8130: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
8140: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
8150: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
8160: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
8170: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
8180: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
8190: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
81a0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
81b0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
81c0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
81d0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
81e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
81f0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
8200: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
8210: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
8220: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
8230: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
8240: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8250: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
8260: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8270: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8280: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8290: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
82a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
82b0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
82c0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
82d0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
82e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
82f0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8300: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
8310: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
8320: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
8330: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
8340: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
8350: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
8360: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
8370: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
8380: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
8390: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
83a0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
83b0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
83c0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
83d0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
83e0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
83f0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
8400: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
8410: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8420: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
8430: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
8440: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
8450: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
8460: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
8470: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
8480: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
8490: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
84a0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
84b0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
84c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
84d0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
84e0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
84f0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8500: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8510: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8520: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8530: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8540: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8550: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8560: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8570: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8580: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8590: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
85a0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
85b0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
85c0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
85d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
85e0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
85f0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8600: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8610: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
8620: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
8630: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
8640: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
8650: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
8660: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
8670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
8680: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
8690: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
86a0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
86b0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
86c0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
86d0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
86e0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
86f0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8700: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
8710: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
8720: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
8730: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
8740: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
8750: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
8760: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
8770: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
8780: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
87a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
87b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
87c0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
87d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
87e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
87f0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8800: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8810: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8820: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8830: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
8840: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8850: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
8860: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
8870: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
8880: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8890: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
88a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
88b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
88c0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
88d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
88e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
88f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8900: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8910: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8920: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
8930: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
8940: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
8950: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
8960: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
8970: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
8980: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8990: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
89a0: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
89b0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
89c0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
89d0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
89e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
89f0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8a00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8a10: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8a20: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
8a30: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
8a40: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8a50: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
8a60: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
8a70: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
8a80: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8a90: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
8aa0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
8ab0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
8ac0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
8ad0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8ae0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8af0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8b00: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8b10: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8b20: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8b30: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8b40: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8b50: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8b60: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8b70: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
8b80: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8b90: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
8ba0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
8bb0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
8bc0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
8bd0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8be0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8bf0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8c00: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8c10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8c20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8c30: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8c40: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8c50: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8c60: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8c70: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
8c80: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8c90: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
8ca0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
8cb0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
8cc0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
8cd0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8ce0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8cf0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8d00: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8d10: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8d20: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8d30: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8d40: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8d50: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8d60: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8d70: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
8d80: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8d90: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
8da0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
8db0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
8dc0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
8dd0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8de0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8df0: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8e00: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8e10: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8e20: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e40: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8e50: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8e80: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8e90: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8eb0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
8ec0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
8ed0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8ef0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8f00: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f20: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8f30: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8f40: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8f50: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8f60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8f70: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
8f80: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8fa0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8fb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8fc0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
8fd0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8fe0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8ff0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
9000: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
9010: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
9020: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
9030: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
9040: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
9050: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
9060: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
9070: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
9080: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
9090: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
90a0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
90b0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
90c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
90d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
90e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
90f0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
9100: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
9110: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
9120: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
9130: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
9140: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9150: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9160: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
9170: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
9180: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9190: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
91a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
91b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
91c0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
91d0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
91e0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
91f0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
9200: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
9210: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
9220: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9230: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
9240: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
9250: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
9260: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
9270: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
9280: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
9290: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
92a0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
92b0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
92c0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
92d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
92e0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
92f0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
9300: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
9310: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
9320: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
9330: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
9340: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
9350: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
9360: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
9370: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
9380: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
9390: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
93a0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
93b0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
93c0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
93d0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
93e0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
93f0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
9400: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
9410: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
9420: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
9430: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
9440: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9450: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9460: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
9470: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
9480: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
9490: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
94a0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
94b0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
94c0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
94d0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
94e0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
94f0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
9500: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
9510: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
9520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9530: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
9540: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
9550: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
9560: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
9570: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
9580: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
9590: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
95a0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
95b0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
95c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
95d0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
95e0: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
95f0: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
9600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9610: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9620: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
9630: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9640: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
9650: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
9660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9670: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9680: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9690: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
96a0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
96b0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
96c0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
96d0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
96e0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
96f0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
9700: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9710: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9720: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
9730: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
9740: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
9750: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
9760: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
9770: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
9780: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9790: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
97a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
97b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
97c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
97d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
97e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
97f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9810: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9820: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9830: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
9840: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
9850: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
9860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9870: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
9880: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9890: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
98a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
98b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
98c0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
98d0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
98e0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
98f0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9900: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9910: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9920: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
9930: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
9940: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
9950: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
9960: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
9970: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
9980: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9990: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
99a0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
99b0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
99c0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
99d0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
99e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
99f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9a00: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9a10: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9a20: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
9a30: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
9a40: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
9a50: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
9a60: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
9a70: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
9a80: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9a90: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
9aa0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
9ab0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
9ac0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
9ad0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9ae0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9af0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9b00: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9b10: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9b20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9b30: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9b40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9b50: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9b60: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9b70: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9b80: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9b90: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9ba0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
9bb0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
9bc0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9bd0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9be0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9bf0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9c00: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9c30: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9c40: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9c50: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9c80: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9c90: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
9ca0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
9cb0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
9cc0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
9cd0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9ce0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9cf0: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9d00: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9d10: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9d20: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
9d30: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
9d40: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
9d50: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9d60: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9d70: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9d80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9d90: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
9da0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9db0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9dc0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9dd0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
9de0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
9df0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9e00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9e10: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9e20: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9e30: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9e40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9e50: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9e60: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9e70: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
9e80: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9e90: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
9ea0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9eb0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
9ec0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
9ed0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
9ee0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9ef0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9f00: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9f10: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9f20: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9f30: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
9f40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9f50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9f60: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9f70: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9f80: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9f90: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9fa0: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9fb0: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9fc0: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9fd0: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9fe0: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9ff0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
a000: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
a010: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a020: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
a030: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
a040: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
a050: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
a060: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
a070: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
a080: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
a090: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
a0a0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
a0b0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
a0c0: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
a0d0: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
a0e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
a0f0: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
a100: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
a110: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
a120: 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 69  to accommodate i
a130: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
a140: 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20  t pc, addr;.    
a150: 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20  for(addr=hdr+1; 
a160: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
a170: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20  data[addr]))>0; 
a180: 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20  addr=pc){.      
a190: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
a1a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a1b0: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
a1c0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
a1d0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
a1e0: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
a1f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a200: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a       }.      siz
a220: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
a230: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
a240: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
a250: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
a260: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
a270: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
a280: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
a290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
a2a0: 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =3 );.        if
a2b0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
a2c0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
a2d0: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
a2e0: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
a2f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
a300: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67           ** frag
a310: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
a320: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
a330: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
a340: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
a350: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
a360: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
a370: 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67  +7] = (u8)(nFrag
a380: 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d   + x);.        }
a390: 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63  else if( size+pc
a3a0: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
a3b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a3c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a3d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
a3e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a3f0: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
a400: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
a410: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
a420: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
a430: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
a440: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
a450: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
a460: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
a470: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
a480: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
a490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a4a0: 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20     *pIdx = pc + 
a4b0: 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  x;.        retur
a4c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
a4d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
a4e0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
a4f0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
a500: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e   enough space in
a510: 20 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69   the gap to sati
a520: 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  sfy.  ** the all
a530: 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74  ocation.  If not
a540: 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20  , defragment..  
a550: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
a560: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
a570: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
a580: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
a590: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
a5a0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
a5b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a5c0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
a5d0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
a5e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
a5f0: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
a600: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
a610: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
a620: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
a630: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
a640: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
a650: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
a660: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a670: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
a680: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
a690: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
a6a0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
a6b0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
a6c0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
a6d0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
a6e0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
a6f0: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
a700: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
a710: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
a720: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
a730: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
a740: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
a750: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
a760: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
a770: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
a780: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
a790: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
a7a0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
a7b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a7c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
a7d0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a7f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
a800: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
a810: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
a820: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
a830: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a840: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
a850: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
a860: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
a870: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
a880: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
a890: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
a8a0: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
a8b0: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
a8c0: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
a8d0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
a8e0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
a8f0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
a900: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
a910: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
a920: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a930: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
a940: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
a950: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
a960: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
a990: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
a9a0: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
a9b0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
a9c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
a9d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a9e0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a9f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
aa00: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
aa10: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
aa20: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
aa30: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
aa40: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
aa50: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
aa60: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
aa70: 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  ze) <= (int)pPag
aa80: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
aa90: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
aaa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
aab0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
aac0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
aad0: 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20  t( size>=0 );   
aae0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
aaf0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20  size is 4 */..  
ab00: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ab10: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
ab20: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
ab30: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
ab40: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
ab50: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
ab60: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
ab70: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
ab80: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
ab90: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
aba0: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
abb0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
abc0: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
abd0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
abe0: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
abf0: 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61  locks.  Note tha
ac00: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75  t.  ** even thou
ac10: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
ac20: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
ac30: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
ac40: 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65  ge(),.  ** btree
ac50: 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20 6e  InitPage() did n
ac60: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
ac70: 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20  pping cells or. 
ac80: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   ** freeblocks t
ac90: 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63  hat overlapped c
aca0: 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73  ells.   Nor does
acb0: 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e 20   it detect when 
acc0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f  the.  ** cell co
acd0: 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65 65  ntent area excee
ace0: 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ds the value in 
acf0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
ad00: 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20    If these.  ** 
ad10: 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65  situations arise
ad20: 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
ad30: 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  t insert operati
ad40: 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70  ons might corrup
ad50: 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c  t.  ** the freel
ad60: 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  ist.  So we do n
ad70: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  eed to check for
ad80: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c   corruption whil
ad90: 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20  e scanning.  ** 
ada0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
adb0: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
adc0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
add0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
ade0: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
adf0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ae00: 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73  - 4;.  assert( s
ae10: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20  tart<=iLast );. 
ae20: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
ae30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ae40: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
ae50: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
ae60: 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64    if( pbegin<add
ae70: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  r+4 ){.      ret
ae80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ae90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
aea0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
aeb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67  ;.  }.  if( pbeg
aec0: 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  in>iLast ){.    
aed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
aee0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
aef0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
af00: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
af10: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
af20: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
af30: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
af40: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
af50: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
af60: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
af70: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
af80: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
af90: 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73  ->nFree + (u16)s
afa0: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
afb0: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
afc0: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
afd0: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
afe0: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
aff0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b000: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
b010: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
b020: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
b030: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
b040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b050: 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  gin <= (int)pPag
b060: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b070: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
b080: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
b090: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
b0a0: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
b0b0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
b0c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
b0d0: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
b0e0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
b0f0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
b100: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
b110: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
b120: 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30       if( (frag<0
b130: 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29  ) || (frag>(int)
b140: 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a  data[hdr+7]) ){.
b150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b160: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b170: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
b180: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
b190: 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20   (u8)frag;.     
b1a0: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
b1b0: 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20  ata[pnext]);.   
b1c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
b1d0: 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20  a[pbegin], x);. 
b1e0: 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b       x = pnext +
b1f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b200: 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67  pnext+2]) - pbeg
b210: 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  in;.      put2by
b220: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b230: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73  2], x);.    }els
b240: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  e{.      addr = 
b250: 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  pbegin;.    }.  
b260: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
b270: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b280: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66   begins with a f
b290: 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65  reeblock, remove
b2a0: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61   it. */.  if( da
b2b0: 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b  ta[hdr+1]==data[
b2c0: 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68  hdr+5] && data[h
b2d0: 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+2]==data[hdr+
b2e0: 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f  6] ){.    int to
b2f0: 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20  p;.    pbegin = 
b300: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b310: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+1]);.    memc
b320: 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  py(&data[hdr+1],
b330: 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20   &data[pbegin], 
b340: 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  2);.    top = ge
b350: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b360: 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28  +5]) + get2byte(
b370: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
b380: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
b390: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
b3a0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b3b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b3c0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b3d0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
b3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
b400: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
b410: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
b420: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
b430: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
b440: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
b450: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
b460: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
b470: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
b480: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
b490: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
b4a0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
b4b0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
b4c0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
b4d0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
b4e0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
b4f0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
b500: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
b510: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
b520: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
b530: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
b540: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
b550: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
b560: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
b570: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
b580: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
b590: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
b5a0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
b5b0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
b5c0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
b5d0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
b5e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
b5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
b600: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
b610: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
b620: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b630: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b640: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b650: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
b660: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
b670: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
b680: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
b690: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
b6a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
b6b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b6c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
b6d0: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
b6e0: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
b6f0: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
b700: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b710: 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  EY) ){.    pPage
b720: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
b730: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
b740: 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   = pPage->leaf;.
b750: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b760: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
b770: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b780: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
b790: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
b7a0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
b7b0: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
b7c0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b7d0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b7e0: 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  hasData = 0;.   
b7f0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b800: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b810: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b820: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b830: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
b840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b850: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b860: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
b870: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
b880: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
b890: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
b8a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b8b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
b8c0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
b8d0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
b8e0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
b8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b900: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b910: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
b920: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
b930: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
b940: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
b950: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
b960: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
b970: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
b980: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
b990: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
b9a0: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
b9b0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
b9c0: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
b9d0: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
b9e0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
b9f0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
ba00: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ba10: 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
ba20: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
ba30: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
ba40: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
ba50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ba60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ba70: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ba80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ba90: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
baa0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
bab0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
bac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bad0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
bae0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
baf0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bb00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
bb10: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
bb20: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
bb30: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
bb40: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
bb50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
bb60: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
bb70: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
bb80: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
bb90: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
bba0: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
bbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bbc0: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
bbd0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
bbe0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
bbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
bc00: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
bc10: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
bc20: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
bc30: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
bc40: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
bc50: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
bc60: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
bc70: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
bc80: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
bc90: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
bca0: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
bcb0: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
bcc0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
bcd0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
bce0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
bcf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bd00: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
bd10: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
bd20: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
bd30: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
bd40: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
bd50: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
bd60: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
bd70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
bd80: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
bd90: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
bda0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
bdb0: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
bdc0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
bdd0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
bde0: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
bdf0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
be00: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
be10: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
be20: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
be30: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
be40: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
be50: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
be60: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
be70: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
be80: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
be90: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
bea0: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
beb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
bec0: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
bed0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
bee0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
bef0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
bf00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
bf10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
bf20: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
bf30: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
bf40: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
bf50: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
bf60: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
bf70: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
bf80: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
bf90: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
bfa0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
bfb0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
bfc0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
bfd0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
bfe0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
bff0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
c000: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
c010: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
c020: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
c030: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
c040: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
c050: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
c060: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
c070: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c080: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c090: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
c0a0: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
c0b0: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
c0c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
c0d0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
c0e0: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
c0f0: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
c100: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
c110: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
c120: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
c130: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
c140: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
c150: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
c160: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
c170: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
c180: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
c190: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
c1a0: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
c1b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c1c0: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
c1d0: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
c1e0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
c1f0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
c200: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
c210: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
c220: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
c230: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
c240: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c250: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
c260: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
c270: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
c280: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
c290: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
c2a0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
c2b0: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
c2c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c2d0: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
c2e0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
c2f0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
c300: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c310: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
c320: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
c330: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c340: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
c350: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
c360: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
c370: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
c380: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
c390: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
c3a0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
c3b0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
c3c0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
c3d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c400: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
c410: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
c420: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
c430: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
c440: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
c450: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
c460: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c470: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c480: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c4a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
c4b0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
c4c0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
c4d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
c4e0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
c4f0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
c500: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
c510: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
c520: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
c530: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
c540: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
c550: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
c560: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
c570: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
c580: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
c590: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
c5a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
c5b0: 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69   of free block i
c5c0: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
c5d0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
c5e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c5f0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
c600: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
c610: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
c620: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
c630: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
c640: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
c650: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
c660: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
c670: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c680: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
c690: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
c6a0: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
c6b0: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
c6c0: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
c6d0: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
c6e0: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
c6f0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
c700: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
c710: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c720: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c730: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
c740: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
c750: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
c760: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c770: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
c780: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
c790: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
c7a0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c7b0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
c7c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c7d0: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
c7e0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c7f0: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
c800: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c810: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
c820: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c830: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
c840: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
c850: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
c860: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c870: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c880: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c890: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c8a0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c8b0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c8c0: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c8d0: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c8e0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c8f0: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c900: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c910: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c920: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c930: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c940: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c950: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c960: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c970: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c980: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c990: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c9a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c9b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c9c0: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c9d0: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c9e0: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c9f0: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
ca00: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
ca10: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
ca20: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
ca30: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
ca40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
ca50: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
ca60: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
ca70: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
ca80: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
ca90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
caa0: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
cab0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cac0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
cad0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cae0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
caf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cb00: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
cb10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
cb20: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
cb30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cb40: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cb60: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
cb70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cb80: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
cb90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
cba0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cbb0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
cbc0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
cbd0: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
cbe0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
cbf0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
cc00: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
cc10: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
cc20: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
cc30: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
cc40: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
cc50: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
cc60: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
cc70: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
cc80: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
cc90: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
cca0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
ccb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ccc0: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
ccd0: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
cce0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
ccf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
cd00: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
cd10: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
cd20: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
cd30: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
cd40: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
cd50: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
cd60: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
cd70: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
cd80: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
cd90: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
cda0: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
cdb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
cdc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
cdd0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
cde0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
cdf0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
ce00: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
ce10: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
ce20: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
ce30: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
ce40: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
ce50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
ce60: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
ce70: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
ce80: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
ce90: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
cea0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
ceb0: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
cec0: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
ced0: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
cee0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
cef0: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
cf00: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
cf10: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
cf20: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
cf30: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
cf40: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
cf50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
cf60: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
cf70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
cf80: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
cf90: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
cfa0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
cfb0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
cfc0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
cfd0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
cfe0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
cff0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
d000: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d010: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
d020: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
d030: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
d040: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
d050: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
d060: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
d070: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
d080: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
d090: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
d0a0: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
d0b0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
d0c0: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
d0d0: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
d0e0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
d0f0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
d100: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
d110: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
d120: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
d130: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
d140: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
d150: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
d160: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
d170: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
d180: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
d190: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
d1a0: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
d1b0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
d1c0: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
d1d0: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
d1e0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
d1f0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
d200: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
d210: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
d220: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
d230: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d240: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
d250: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
d260: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
d270: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
d280: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
d290: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
d2a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
d2b0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d2c0: 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
d2d0: 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
d2e0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
d2f0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
d300: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
d310: 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
d320: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
d330: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
d340: 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
d350: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d360: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d370: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
d380: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
d390: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
d3a0: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
d3b0: 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
d3c0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
d3d0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
d3e0: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
d3f0: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
d400: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
d410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
d430: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
d440: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
d450: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
d460: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
d470: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
d480: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
d490: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
d4a0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
d4b0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
d4c0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
d4d0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
d4e0: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
d4f0: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
d500: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
d510: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
d520: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
d530: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d540: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d550: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
d560: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
d570: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
d580: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
d590: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
d5a0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
d5b0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
d5c0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
d5d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
d5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d5f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d600: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d610: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
d620: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
d630: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
d640: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
d650: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
d660: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
d670: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
d680: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
d690: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
d6a0: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
d6b0: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
d6c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d6d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d6e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
d6f0: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
d700: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
d710: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
d720: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d730: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d740: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d750: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d760: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d770: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d780: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d790: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d7a0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d7b0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d7c0: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d7d0: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d7e0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d7f0: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d800: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d810: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d820: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d830: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d840: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d850: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d860: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d870: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d880: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d890: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d8b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
d8c0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d8f0: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
d900: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
d910: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
d920: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d930: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d940: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
d950: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
d960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
d970: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
d980: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
d990: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d9a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d9b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d9c0: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
d9d0: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
d9e0: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
d9f0: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
da00: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
da10: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
da20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
da30: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
da40: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
da50: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
da60: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
da70: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
da80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
da90: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
daa0: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
dab0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
dac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
dad0: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
dae0: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
daf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
db00: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
db10: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
db20: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
db30: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
db40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
db50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
db60: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
db70: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
db80: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
db90: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
dba0: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
dbb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dbc0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
dbd0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
dbe0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
dbf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
dc00: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
dc10: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
dc20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
dc30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
dc40: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
dc50: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
dc60: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
dc70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
dc80: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
dc90: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
dca0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
dcb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dcc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dcd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
dce0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
dcf0: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
dd00: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
dd10: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
dd20: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
dd30: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
dd40: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
dd50: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
dd60: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
dd70: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
dd80: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
dd90: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
dda0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
ddb0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
ddc0: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
ddd0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
dde0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ddf0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
de00: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
de10: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
de20: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
de30: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
de40: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
de50: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
de60: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
de70: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
de80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
de90: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
dea0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
deb0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
dec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ded0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
dee0: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
def0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
df00: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
df10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
df20: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
df30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
df40: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
df50: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
df60: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
df70: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
df80: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
df90: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
dfa0: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
dfb0: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
dfc0: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
dfd0: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
dfe0: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
dff0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
e000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
e010: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
e020: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
e030: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
e040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e050: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
e060: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
e070: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
e080: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
e090: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
e0a0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
e0b0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
e0c0: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
e0d0: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
e0e0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
e0f0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
e100: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
e110: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
e120: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
e130: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
e150: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e160: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
e170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e180: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
e190: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
e1a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e1b0: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
e1c0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
e1d0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
e1e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e1f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
e200: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
e210: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
e220: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
e230: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
e240: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
e250: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
e260: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
e270: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
e280: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e290: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
e2a0: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
e2b0: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
e2c0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
e2d0: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
e2e0: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
e2f0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
e300: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
e310: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
e320: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
e330: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
e340: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
e350: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
e360: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
e370: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
e380: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
e390: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
e3a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
e3b0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e3c0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
e3d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e3e0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
e3f0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
e400: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
e410: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
e420: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
e430: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
e440: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
e450: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
e460: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
e470: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
e480: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
e490: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
e4a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
e4b0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
e4c0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e4d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
e4e0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
e4f0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
e500: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
e510: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
e520: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
e530: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
e540: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
e550: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
e560: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
e570: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
e580: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
e590: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
e5a0: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
e5b0: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
e5c0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
e5d0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
e5e0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e5f0: 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
e600: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
e610: 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
e620: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e630: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
e640: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
e650: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
e660: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
e670: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
e680: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
e690: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e6a0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
e6b0: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
e6c0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
e6d0: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
e6e0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
e6f0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
e700: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
e710: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
e720: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
e730: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
e740: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
e750: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
e760: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e770: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
e780: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
e790: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
e7a0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
e7b0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
e7d0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
e7e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e7f0: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
e800: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
e810: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
e820: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
e830: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e840: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e850: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
e860: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
e870: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
e880: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
e890: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
e8a0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
e8b0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
e8c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
e8d0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
e8e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
e8f0: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
e900: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
e910: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
e920: 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
e930: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
e940: 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
e950: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
e960: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
e970: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
e980: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
e990: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
e9a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e9b0: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
e9c0: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
e9d0: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
e9e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e9f0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
ea00: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
ea10: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
ea20: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
ea30: 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
ea40: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
ea50: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
ea60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ea70: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
ea80: 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
ea90: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
eaa0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
eab0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
eac0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
ead0: 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
eae0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
eaf0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
eb00: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
eb10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eb20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
eb30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
eb40: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
eb50: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
eb60: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
eb70: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
eb80: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
eb90: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
eba0: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
ebb0: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
ebc0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
ebd0: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
ebe0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
ebf0: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
ec00: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
ec10: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
ec20: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
ec30: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
ec40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
ec50: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
ec60: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
ec70: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
ec80: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
ec90: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
eca0: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
ecb0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ecc0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
ecd0: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
ece0: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
ecf0: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
ed00: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
ed10: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
ed20: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
ed30: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
ed40: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
ed50: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
ed60: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
ed70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed80: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
ed90: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
eda0: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
edb0: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
edc0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
edd0: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
ede0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
edf0: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
ee00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
ee10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ee20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ee30: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ee40: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
ee50: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
ee60: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
ee70: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
ee80: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
ee90: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
eea0: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
eeb0: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
eec0: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
eed0: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
eee0: 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
eef0: 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
ef00: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
ef10: 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
ef20: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
ef30: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
ef40: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
ef50: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
ef60: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
ef70: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
ef80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
ef90: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
efa0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
efb0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
efc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
efd0: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
efe0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
eff0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
f000: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
f010: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f020: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
f030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f040: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
f050: 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
f060: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
f070: 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
f080: 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
f090: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
f0a0: 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
f0b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f0d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
f0e0: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
f120: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f130: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
f140: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f150: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
f160: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
f170: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f180: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
f190: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f1a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
f1b0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f1c0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
f1d0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f1e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f1f0: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
f200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f210: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
f220: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
f230: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
f240: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f250: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f260: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
f270: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f280: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
f290: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
f2a0: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
f2b0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f2c0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
f2d0: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
f2e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
f2f0: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
f300: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f310: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
f320: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
f330: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
f340: 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
f370: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
f380: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
f390: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
f3a0: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
f3b0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
f3c0: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
f3d0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
f3e0: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
f3f0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
f400: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
f410: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
f420: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f440: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f450: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f470: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f480: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
f490: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f4a0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f4b0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
f4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f4d0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
f4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f4f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
f500: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f520: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
f530: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
f540: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
f550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f560: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f570: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f580: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
f590: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f5a0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
f5b0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
f5c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f5d0: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
f5e0: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
f5f0: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
f600: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
f610: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
f620: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
f630: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
f640: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
f650: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
f660: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
f670: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
f680: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
f690: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
f6a0: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
f6b0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
f6c0: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
f6d0: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
f6e0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
f6f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
f700: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
f710: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
f720: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
f730: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
f740: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f750: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
f760: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
f770: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
f780: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
f790: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
f7a0: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
f7b0: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
f7c0: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
f7d0: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
f7e0: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
f7f0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
f800: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
f810: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
f820: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f830: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
f840: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
f850: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f860: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
f870: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f880: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
f890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f8a0: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
f8b0: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
f8c0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
f8d0: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
f8e0: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
f8f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f900: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f910: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
f920: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
f930: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f940: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
f950: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
f960: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
f980: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
f990: 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
f9a0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
f9b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
f9d0: 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
f9e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
f9f0: 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
fa00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fa10: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
fa20: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
fa30: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
fa40: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
fa50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fa60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fa70: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
fa80: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
fa90: 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
faa0: 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
fab0: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
fac0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fad0: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
fae0: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
faf0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
fb00: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
fb10: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
fb20: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
fb30: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
fb40: 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
fb50: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
fb60: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
fb70: 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
fb80: 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
fb90: 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
fba0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
fbb0: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
fbc0: 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
fbd0: 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
fbe0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
fbf0: 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
fc00: 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
fc10: 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
fc20: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
fc30: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
fc40: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
fc50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
fc60: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
fc70: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
fc80: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
fc90: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
fca0: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
fcb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fcc0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
fcd0: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
fce0: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
fcf0: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
fd00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
fd10: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
fd20: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
fd30: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
fd40: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
fd50: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
fd60: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
fd70: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
fd80: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
fd90: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
fda0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fdb0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
fdc0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
fdd0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
fde0: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
fdf0: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
fe00: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
fe10: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
fe20: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
fe30: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
fe40: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
fe50: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
fe60: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
fe70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
fe80: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
fe90: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
fea0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
feb0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
fec0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fed0: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
fee0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
fef0: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
ff00: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
ff10: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
ff20: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
ff30: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
ff40: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
ff50: 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
ff60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ff70: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ff80: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
ff90: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ffa0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ffb0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
ffc0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ffd0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
ffe0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
fff0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
10000 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
10010 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10020 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
10030 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
10040 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
10050 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
10060 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10070 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
10080 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
10090 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
100a0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
100b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
100c0 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
100d0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
100e0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
100f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10100 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10110 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
10120 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10130 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
10140 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
10150 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
10160 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
10170 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
10180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10190 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
101a0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
101b0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
101c0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
101d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
101e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
101f0 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
10200 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
10210 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10220 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10230 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
10240 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
10250 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
10260 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
10270 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
10280 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
10290 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
102a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
102b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
102c0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
102d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
102e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
102f0 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
10300 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
10310 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
10320 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10330 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10340 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10350 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
10360 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
10370 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
10380 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10390 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
103a0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
103b0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
103c0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
103d0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
103e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
103f0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
10400 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10410 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
10420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10430 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10450 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
10460 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
10470 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
10480 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
10490 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
104a0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
104b0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
104c0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
104d0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
104e0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
104f0 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
10500 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
10510 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
10520 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
10530 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
10540 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
10550 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
10560 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
10570 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
10580 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
10590 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
105a0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
105b0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
105c0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
105d0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
105e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
105f0 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
10600 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
10610 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
10620 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
10630 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
10640 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
10650 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10660 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
10670 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
10680 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
10690 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
106a0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
106b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
106c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
106d0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
106e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
106f0 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
10700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10710 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
10720 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10730 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
10740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10750 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
10760 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
10770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10780 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
10790 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
107a0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
107b0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
107c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
107d0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
107e0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
107f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
10800 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
10810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10820 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
10830 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10840 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
10850 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
10860 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
10870 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
10880 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
10890 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
108a0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
108b0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
108c0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
108d0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
108e0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
108f0 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
10900 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
10910 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10920 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10930 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10940 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
10950 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10960 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
10970 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
10980 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
10990 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
109a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
109b0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
109c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
109d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
109e0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
109f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10a00 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
10a10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
10a30 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
10a40 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
10a50 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
10a60 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
10a70 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
10a80 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
10a90 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
10aa0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
10ab0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10ac0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
10ad0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
10ae0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
10af0 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
10b00 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
10b10 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
10b20 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
10b30 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
10b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10b50 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
10b60 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10b70 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10b80 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
10b90 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
10ba0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
10bb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10bc0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
10bd0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
10be0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
10bf0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10c00 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10c10 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10c20 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
10c30 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
10c40 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
10c50 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
10c60 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
10c70 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10c80 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10c90 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
10ca0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
10cb0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10cc0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
10cd0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
10ce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10cf0 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
10d00 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10d10 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
10d20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
10d30 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
10d40 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
10d50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
10d60 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
10d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10d80 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
10d90 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10da0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
10db0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10dc0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
10dd0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
10de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10df0 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
10e00 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
10e10 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
10e20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
10e30 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
10e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
10e50 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
10e60 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
10e70 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10e80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
10e90 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
10ea0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
10eb0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
10ec0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
10ed0 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
10ee0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
10ef0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
10f00 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
10f10 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
10f20 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
10f30 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
10f40 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
10f50 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
10f60 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
10f70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
10f80 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
10f90 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
10fa0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
10fb0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
10fc0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
10fd0 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
10fe0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
10ff0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
11000 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
11010 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
11020 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
11030 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
11040 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
11050 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
11060 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
11070 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
11080 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
11090 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
110a0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
110b0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
110c0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
110d0 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
110e0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
110f0 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
11100 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
11110 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
11120 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
11130 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
11140 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
11150 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
11160 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
11170 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
11180 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
11190 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
111a0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
111b0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
111c0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
111d0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
111e0 70 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a  p space here.  *
111f0 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
11200 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65  TmpSpace ) memse
11210 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
11220 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 4);.  }.}..
11230 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
11240 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
11250 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
11260 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
11270 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
11280 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
11290 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
112a0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
112b0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
112c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
112d0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
112e0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
112f0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
11300 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
11310 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
11320 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11330 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
11340 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
11350 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
11360 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
11370 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
11380 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11390 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
113a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
113b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
113c0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
113d0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
113e0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
113f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
11400 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
11410 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
11420 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
11430 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
11440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11450 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
11460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11470 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
11480 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
11490 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
114a0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
114b0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
114c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
114d0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
114e0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
114f0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
11500 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
11510 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
11520 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
11530 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11540 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
11550 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
11560 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
11570 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
11580 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
11590 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
115a0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
115b0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
115c0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
115d0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
115e0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
115f0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
11600 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
11610 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
11620 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
11630 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
11640 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
11650 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
11660 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
11670 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
11680 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
11690 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
116a0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
116b0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
116c0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
116d0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
116e0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
116f0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11700 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11710 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11720 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11730 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11740 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11750 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11760 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
11770 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
11780 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
11790 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
117a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
117b0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
117c0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
117d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
117e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
117f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11810 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11820 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11830 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11840 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11850 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
11860 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
11870 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
11880 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
11890 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
118a0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
118b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
118c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
118d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
118e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
118f0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11900 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11910 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11930 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11940 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11950 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11960 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11970 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11980 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
11990 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
119a0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
119b0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
119c0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
119d0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
119e0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
119f0 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11a00 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11a10 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11a20 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11a30 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11a40 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11a50 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11a60 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11a70 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11a80 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11a90 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
11aa0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
11ab0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
11ac0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
11ad0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
11ae0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
11af0 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11b00 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11b10 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11b20 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11b30 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11b40 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11b50 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11b60 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11b70 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11b80 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11b90 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
11ba0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
11bb0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
11bc0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
11bd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11be0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11bf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11c00 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11c20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11c30 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11c40 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11c50 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11c60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11c70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11c90 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
11ca0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
11cb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11cc0 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
11cd0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
11ce0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11cf0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
11d00 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
11d10 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
11d20 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
11d30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d50 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11d60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11d70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11d80 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11d90 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
11da0 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
11db0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
11dc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11df0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
11e00 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11e10 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11e20 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11e30 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11e40 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11e50 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11e60 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11e70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11e80 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11e90 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11ea0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
11eb0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
11ec0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
11ed0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11ee0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
11ef0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
11f00 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11f10 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11f20 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11f30 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11f40 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11f50 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11f60 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11f70 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11f80 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11f90 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11fa0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11fb0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
11fc0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
11fd0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
11fe0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12000 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
12010 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
12020 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
12030 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
12040 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
12050 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
12060 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12070 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
12080 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12090 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
120a0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
120b0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
120c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
120d0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
120e0 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
120f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12100 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
12120 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
12130 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
12140 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
12150 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
12160 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
12170 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
12180 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
12190 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
121a0 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
121b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
121c0 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
121d0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
121e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
121f0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
12200 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12210 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12220 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
12230 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12240 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
12250 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
12260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12270 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
12280 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
12290 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
122a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
122b0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
122c0 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
122d0 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
122e0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
122f0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
12300 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
12310 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
12320 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
12330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
12340 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
12350 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
12360 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
12370 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
12380 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
12390 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
123a0 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
123b0 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
123c0 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
123d0 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
123e0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
123f0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
12400 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
12410 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
12420 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
12430 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
12440 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
12450 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
12460 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
12470 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
12480 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
12490 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
124a0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
124b0 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
124c0 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
124d0 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
124e0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
124f0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
12500 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
12510 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
12520 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
12530 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
12540 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
12550 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
12560 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
12570 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
12580 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
12590 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
125a0 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
125b0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
125c0 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
125d0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
125e0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
125f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
12600 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
12610 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
12620 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
12630 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
12640 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12650 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12660 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
12670 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
12680 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
12690 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
126a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
126b0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
126c0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
126d0 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
126e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
126f0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
12700 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
12710 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
12720 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
12730 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
12740 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
12750 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
12760 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
12770 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
12780 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
12790 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
127a0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
127b0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
127c0 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
127d0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
127e0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
127f0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
12800 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
12810 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
12820 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
12830 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
12840 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
12850 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
12860 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
12870 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12880 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
12890 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
128a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
128b0 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
128c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
128d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
128e0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
128f0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
12900 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
12910 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
12920 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12930 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12940 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
12950 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
12960 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
12970 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
12980 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
12990 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
129a0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
129b0 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20  ageSize;.}..#if 
129c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
129d0 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66  AS_CODEC) || def
129e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
129f0 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  G)./*.** This fu
12a00 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
12a10 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
12a20 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
12a30 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
12a40 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
12a50 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
12a60 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
12a70 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
12a80 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
12a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
12aa0 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
12ab0 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
12ac0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
12ad0 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
12ae0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
12af0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
12b00 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
12b10 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
12b20 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
12b30 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
12b40 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
12b50 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
12b60 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
12b70 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
12b80 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
12b90 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
12ba0 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
12bb0 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
12bc0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
12bd0 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
12be0 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
12bf0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
12c00 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
12c10 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
12c20 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
12c30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12c40 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
12c50 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
12c60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12c70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12c80 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
12c90 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20  QLITE_HAS_CODEC 
12ca0 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  || SQLITE_DEBUG 
12cb0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
12cc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12cd0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12ce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12cf0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
12d00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
12d10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12d20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
12d30 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
12d40 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
12d50 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
12d60 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
12d70 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
12d80 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
12d90 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
12da0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
12db0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
12dc0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
12dd0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
12de0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12df0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
12e00 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12e10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12e20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12e30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12e40 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12e50 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
12e60 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
12e70 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
12e80 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
12e90 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
12ea0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
12eb0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
12ec0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
12ed0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
12ee0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
12ef0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
12f00 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12f10 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12f20 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12f30 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12f40 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12f50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12f60 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
12f70 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
12f80 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
12f90 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
12fa0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12fb0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
12fc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
12fd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
12fe0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
12ff0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
13000 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
13010 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
13020 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
13030 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
13040 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
13050 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
13060 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
13070 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
13080 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
13090 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
130a0 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
130b0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
130c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
130d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
130e0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
130f0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
13100 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
13110 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
13120 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
13130 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
13140 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
13150 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
13160 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
13170 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
13180 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
13190 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
131a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
131b0 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66  turn b;.}.#endif
131c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
131d0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
131e0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
131f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13200 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
13210 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
13220 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
13230 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
13240 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
13250 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
13260 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
13270 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
13280 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
13290 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
132a0 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
132b0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
132c0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
132d0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
132e0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
132f0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
13300 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
13310 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
13320 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13330 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
13340 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
13350 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
13360 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13370 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
13380 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
13390 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
133a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
133b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
133c0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
133d0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
133e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
133f0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
13400 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
13410 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
13420 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
13430 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
13440 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
13450 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
13460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
13470 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
13480 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
13490 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
134a0 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
134b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
134c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
134d0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
134e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
134f0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
13500 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
13510 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
13520 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
13530 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
13540 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
13550 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13560 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
13570 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
13580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13590 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
135a0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
135b0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
135c0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
135d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
135e0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
135f0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
13600 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13610 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
13620 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
13630 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
13640 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
13650 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
13660 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
13670 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
13690 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
136a0 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
136b0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
136c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
136d0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
136e0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
136f0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
13700 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
13710 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
13720 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
13730 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
13740 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
13750 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
13760 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
13770 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
13780 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
13790 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
137a0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
137b0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
137c0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
137d0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
137e0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
137f0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
13800 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
13810 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
13820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13830 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
13840 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
13850 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
13860 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
13870 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13880 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
13890 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
138a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
138b0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
138c0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
138d0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
138e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
138f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13900 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
13910 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
13920 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
13930 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
13940 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
13950 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
13960 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13970 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
13980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
13990 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
139a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
139b0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
139c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
139d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
139e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
139f0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
13a00 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
13a10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
13a20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
13a30 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
13a40 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
13a50 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
13a60 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
13a70 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
13a80 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
13a90 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
13aa0 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
13ab0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
13ac0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
13ad0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
13ae0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
13af0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
13b00 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
13b10 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
13b20 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
13b30 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
13b40 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
13b50 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
13b60 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
13b70 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
13b80 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
13b90 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
13ba0 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
13bb0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
13bc0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
13bd0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
13be0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
13bf0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
13c00 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
13c10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13c20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13c40 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
13c50 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
13c60 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
13c70 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13c80 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
13c90 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
13ca0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13cb0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13cc0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
13cd0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
13ce0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
13cf0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
13d00 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13d10 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13d20 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
13d30 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13d40 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
13d50 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
13d60 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
13d70 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
13d80 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
13d90 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
13da0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
13db0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
13dc0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
13dd0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
13de0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
13df0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
13e00 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
13e10 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
13e20 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
13e30 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
13e40 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
13e50 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
13e60 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
13e70 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
13e80 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
13e90 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
13ea0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
13eb0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
13ec0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
13ed0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
13ee0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
13ef0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
13f00 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
13f10 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13f20 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
13f30 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
13f40 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
13f50 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
13f60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13f70 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
13f80 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
13f90 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
13fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13fb0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
13fc0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13fe0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
13ff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14000 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
14010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14020 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
14030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14040 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
14050 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
14060 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
14070 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14080 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
14090 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
140a0 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
140b0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
140c0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
140d0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
140e0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
140f0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
14100 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
14110 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
14120 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
14130 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
14140 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
14150 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
14160 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
14170 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
14180 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
14190 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
141a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
141b0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
141c0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
141d0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
141e0 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
141f0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
14200 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
14210 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
14220 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14230 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
14240 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
14250 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
14260 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
14270 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
14280 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
14290 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
142a0 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
142b0 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
142c0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
142d0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
142e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
142f0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
14300 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
14310 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
14320 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
14330 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
14340 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
14350 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
14360 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
14370 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
14380 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
14390 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
143a0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
143b0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
143c0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
143d0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
143e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
143f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
14400 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
14410 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
14420 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
14430 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
14440 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
14450 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
14460 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
14470 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
14480 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
14490 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
144a0 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
144b0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
144c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
144d0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
144e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
144f0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14520 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
14530 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
14540 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14550 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
14560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
14570 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
14580 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
14590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
145a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
145b0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
145c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
145d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
145e0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
145f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
14600 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14610 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
14620 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
14630 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
14640 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
14650 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
14660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14670 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
14680 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
14690 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
146a0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
146b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
146c0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
146d0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
146e0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
146f0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
14700 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
14710 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
14720 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
14730 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
14740 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
14750 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
14760 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
14770 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
14780 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
14790 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
147a0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
147b0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
147c0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
147d0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
147e0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
147f0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
14800 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14810 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
14820 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
14830 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
14840 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
14850 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
14860 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
14870 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
14880 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
14890 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
148a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
148b0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
148c0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
148d0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
148e0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
148f0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
14900 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
14910 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
14920 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
14930 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
14940 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
14950 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
14960 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
14970 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
14980 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
14990 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
149a0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
149b0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
149c0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
149d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
149e0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
149f0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
14a00 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
14a10 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
14a20 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
14a30 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
14a40 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
14a50 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
14a60 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
14a70 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
14a80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
14a90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
14aa0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
14ab0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
14ac0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
14ad0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
14ae0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
14af0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
14b00 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
14b10 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
14b20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14b30 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
14b40 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
14b50 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
14b60 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
14b70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14b80 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
14b90 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
14ba0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
14bb0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
14bc0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
14bd0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
14be0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
14bf0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
14c00 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
14c10 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
14c20 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
14c30 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
14c40 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
14c50 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
14c60 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
14c70 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
14c80 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
14c90 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
14ca0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
14cb0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
14cc0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
14cd0 65 20 64 61 74 61 62 73 65 2e 20 20 43 75 72 73  e databse.  Curs
14ce0 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
14cf0 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
14d00 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
14d10 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
14d20 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
14d30 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
14d40 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
14d50 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
14d60 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
14d70 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
14d80 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
14d90 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
14da0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
14db0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
14dc0 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 43  (wrOnly==0 || pC
14dd0 75 72 2d 3e 77 72 46 6c 61 67 29 20 26 26 20 70  ur->wrFlag) && p
14de0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
14df0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
14e00 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
14e10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14e20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
14e30 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
14e40 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
14e50 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
14e60 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
14e70 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
14e80 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
14e90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
14ea0 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
14eb0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
14ec0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
14ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14ee0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
14ef0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
14f00 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
14f10 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
14f20 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
14f30 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
14f40 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
14f50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14f60 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
14f70 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
14f80 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14fa0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
14fb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
14fc0 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
14fd0 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
14fe0 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
14ff0 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
15000 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
15010 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15020 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
15030 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
15040 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
15050 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
15060 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
15070 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
15080 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
15090 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
150a0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
150b0 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ata );.    relea
150c0 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
150d0 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  e1);.    pBt->pP
150e0 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  age1 = 0;.  }.}.
150f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
15100 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
15110 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
15120 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
15130 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
15140 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
15150 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
15160 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
15170 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
15180 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15190 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
151a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
151b0 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
151c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
151d0 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
151e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
151f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15200 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
15210 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
15220 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15230 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
15240 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
15250 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
15260 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
15270 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
15280 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
15290 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
152a0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
152b0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
152c0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
152d0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
152e0 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
152f0 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
15300 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
15310 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
15320 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
15330 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
15340 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
15350 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
15360 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
15370 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
15380 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
15390 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
153a0 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
153b0 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
153c0 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
153d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
153e0 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
153f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
15400 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
15410 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
15420 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
15430 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
15440 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
15450 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
15460 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
15470 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
15480 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
15490 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
154a0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
154b0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
154c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
154d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
154e0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
154f0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
15500 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
15510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
15520 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
15530 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
15540 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
15550 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
15560 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
15570 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
15580 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
15590 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
155a0 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
155b0 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
155c0 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
155d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
155e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
155f0 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
15600 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
15610 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
15620 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
15630 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
15640 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
15650 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
15660 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
15670 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
15680 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
15690 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
156a0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
156b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
156c0 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
156d0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
156e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
156f0 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
15700 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
15710 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
15720 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15730 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15750 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
15760 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
15770 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
15780 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
15790 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
157a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
157b0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
157c0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
157d0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
157e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
157f0 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
15800 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
15810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15820 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
15830 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
15840 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
15850 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
15860 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
15870 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
15880 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
15890 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
158a0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
158b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
158c0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
158d0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
158e0 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
158f0 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
15900 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
15910 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
15920 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
15930 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
15940 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
15950 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
15960 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
15970 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15980 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
15990 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
159a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
159b0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
159c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
159d0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
159e0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
159f0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
15a00 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
15a10 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
15a20 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15a30 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
15a40 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15a50 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
15a60 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
15a70 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
15a80 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
15a90 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
15aa0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
15ab0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
15ac0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
15ad0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
15ae0 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
15af0 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
15b00 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
15b10 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
15b20 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
15b30 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
15b40 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
15b50 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
15b60 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
15b70 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
15b80 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
15b90 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
15ba0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
15bb0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
15bc0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
15bd0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
15be0 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
15bf0 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
15c00 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
15c10 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
15c20 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
15c30 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
15c40 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
15c50 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
15c60 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
15c70 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
15c80 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
15c90 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
15ca0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
15cb0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
15cc0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
15cd0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
15ce0 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
15cf0 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
15d00 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
15d10 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
15d20 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
15d30 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
15d40 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
15d50 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
15d60 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
15d70 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
15d80 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
15d90 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
15da0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
15db0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
15dc0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
15dd0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
15de0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15df0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
15e00 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
15e10 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
15e20 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
15e30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15e40 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
15e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
15e60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15e70 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
15e80 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
15e90 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
15ea0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
15eb0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
15ec0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
15ed0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
15ee0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
15ef0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
15f00 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
15f10 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
15f20 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
15f30 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15f40 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
15f50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
15f60 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
15f70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
15f80 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
15f90 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15fa0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15fb0 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
15fc0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
15fd0 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
15fe0 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
15ff0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
16000 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
16010 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
16020 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
16030 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
16040 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
16050 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
16060 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
16070 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
16080 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
16090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
160a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
160b0 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
160c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
160d0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
160e0 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
160f0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
16100 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
16110 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
16120 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
16130 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
16140 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
16150 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
16160 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
16170 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
16180 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
16190 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20  NS_WRITE).   || 
161a0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
161b0 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
161c0 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  .  ){.    pBlock
161d0 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
161e0 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >db;.  }else if(
161f0 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
16200 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
16210 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
16220 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
16230 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
16240 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
16250 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
16260 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f   ){.        pBlo
16270 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
16280 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
16290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
162a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
162b0 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Block ){.    sql
162c0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
162d0 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
162e0 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ock);.    rc = S
162f0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
16300 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f  REDCACHE;.    go
16310 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16320 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16330 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
16340 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
16350 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
16360 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
16370 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
16380 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
16390 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
163a0 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
163b0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
163c0 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
163d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
163e0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
163f0 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
16400 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
16410 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
16420 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
16430 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
16440 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
16450 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
16460 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
16470 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
16480 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
16490 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
164a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
164b0 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
164c0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
164d0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
164e0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
164f0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
16500 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
16510 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
16520 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
16530 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
16540 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
16550 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
16560 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
16570 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
16580 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
16590 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
165a0 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
165b0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
165c0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
165d0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
165e0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
165f0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
16600 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
16610 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
16620 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
16630 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
16640 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
16650 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
16660 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
16670 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
16680 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
16690 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
166a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
166b0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
166c0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
166d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
166e0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
166f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
16700 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
16710 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
16720 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16730 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
16740 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
16750 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
16760 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
16770 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16790 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
167a0 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
167b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
167c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
167d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
167e0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
167f0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
16800 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
16810 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
16820 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
16830 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
16840 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
16850 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
16860 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
16870 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
16880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16890 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
168a0 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
168b0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
168c0 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
168d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
168e0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
168f0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
16900 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
16910 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
16920 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
16930 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
16940 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
16950 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
16960 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
16970 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
16980 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
16990 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
169a0 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
169b0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
169c0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
169d0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
169e0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
169f0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16a00 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
16a10 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
16a20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
16a30 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
16a40 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
16a50 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
16a60 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
16a70 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
16a80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16a90 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
16aa0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16ab0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
16ac0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
16ad0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
16ae0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
16af0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
16b00 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
16b10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16b20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
16b30 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
16b40 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
16b50 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
16b60 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
16b70 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
16b80 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
16b90 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
16ba0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
16bb0 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
16bc0 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
16bd0 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
16be0 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
16bf0 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
16c00 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
16c10 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
16c20 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
16c30 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
16c40 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
16c50 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
16c60 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
16c70 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
16c80 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
16c90 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
16ca0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
16cb0 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
16cc0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
16cd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16ce0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
16cf0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
16d00 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
16d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16d20 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
16d30 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
16d40 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
16d50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
16d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16d70 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
16d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16d90 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
16da0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
16db0 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
16dc0 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
16dd0 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
16de0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
16df0 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
16e00 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
16e10 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
16e20 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
16e30 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
16e40 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
16e50 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
16e60 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
16e70 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
16e80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16e90 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
16ea0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
16eb0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
16ec0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
16ed0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
16ee0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16ef0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16f00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16f10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16f20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
16f30 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
16f40 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
16f50 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
16f60 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
16f70 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
16f80 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
16f90 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
16fa0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
16fb0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
16fc0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
16fd0 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
16fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ff0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
17000 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
17010 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17030 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
17040 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
17050 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
17080 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
17090 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
170c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
170d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
170e0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
170f0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
17100 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
17110 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
17120 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
17130 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17140 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
17150 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
17160 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
17170 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
17180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17190 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
171a0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
171b0 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
171c0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
171d0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
171e0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
171f0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
17200 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
17210 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
17220 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
17230 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
17240 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
17250 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
17260 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
17270 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
17280 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
17290 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
172a0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
172b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
172c0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
172d0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
172e0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
172f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
17300 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
17310 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
17320 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
17330 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
17340 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
17350 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
17360 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
17370 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
17380 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
17390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
173a0 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
173b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
173c0 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
173d0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
173e0 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
173f0 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
17400 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
17410 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
17420 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
17430 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
17440 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
17450 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
17460 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
17470 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
17480 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
17490 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
174a0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
174b0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
174c0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
174d0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
174e0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
174f0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
17500 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
17530 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
17540 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
17550 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
17560 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
17570 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
17580 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
17590 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
175a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
175b0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
175c0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
175d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
175e0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
175f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
17600 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
17610 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
17620 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
17630 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17640 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
17650 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
17660 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
17670 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
17680 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
17690 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
176a0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
176b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
176c0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
176d0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
176e0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
176f0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
17700 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
17710 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
17720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17730 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17740 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
17750 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
17760 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
17770 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
17780 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
17790 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
177a0 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
177b0 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61  .    btreeInitPa
177c0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e  ge(pPage);.    n
177d0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
177e0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
177f0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
17800 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
17810 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
17820 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
17830 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17840 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
17850 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
17860 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  fo;.        btre
17870 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
17880 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
17890 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
178a0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20  info.iOverflow. 
178b0 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c          && pCell
178c0 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
178d0 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b  3<=pPage->aData+
178e0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a  pPage->maskPage.
178f0 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f           && iFro
17900 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
17910 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
17920 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  w]).        ){. 
17930 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
17940 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
17950 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
17960 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
17970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17990 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
179a0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
179b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
179c0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
179d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
179e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
179f0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
17a00 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
17a10 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
17a20 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
17a30 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
17a40 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
17a50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
17a60 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
17a70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17a80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17a90 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
17aa0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
17ab0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
17ac0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
17ad0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
17ae0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
17af0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
17b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b10 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
17b20 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
17b30 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
17b40 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
17b50 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
17b60 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
17b70 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
17b80 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
17b90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
17ba0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
17bb0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
17bc0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
17bd0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
17be0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
17bf0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
17c00 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
17c10 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
17c20 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
17c30 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
17c40 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
17c50 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
17c60 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
17c70 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
17c80 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
17c90 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
17ca0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
17cb0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
17cc0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
17cd0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
17ce0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
17cf0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
17d00 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
17d10 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
17d20 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
17d30 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
17d40 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
17d50 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
17d60 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
17d70 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
17d80 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
17d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
17da0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
17db0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
17dc0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
17dd0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
17de0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
17df0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
17e00 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
17e10 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
17e20 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
17e30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
17e40 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
17e50 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
17e60 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
17e70 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
17e80 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
17e90 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
17ea0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
17eb0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17ec0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
17ed0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
17ee0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
17ef0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
17f00 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
17f10 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
17f20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17f30 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
17f50 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
17f60 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
17f70 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
17f80 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
17f90 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
17fa0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
17fb0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
17fc0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
17fd0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
17fe0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
17ff0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
18000 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
18010 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
18020 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
18030 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
18040 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
18050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
18060 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
18070 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
18080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
180a0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
180b0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
180c0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
180d0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
180e0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
180f0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
18100 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
18110 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
18120 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
18130 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
18140 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
18150 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
18160 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
18170 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
18180 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
18190 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
181a0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
181b0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
181c0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
181d0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
181e0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
181f0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
18200 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
18210 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
18220 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
18230 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
18240 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
18250 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
18260 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
18270 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
18280 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
18290 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
182a0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
182b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
182c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
182d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
182e0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
182f0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
18300 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
18310 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
18320 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
18330 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
18340 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
18350 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
18360 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
18370 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
183a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
183b0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
183c0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
183d0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
183e0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
183f0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
18400 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
18410 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
18420 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
18430 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
18440 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
18450 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
18460 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
18470 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
18480 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
18490 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
184a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
184b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
184c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
184d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
184e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
184f0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
18500 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
18510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18520 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18530 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
18540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18550 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
18560 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
18570 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
18580 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
18590 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
185a0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
185b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
185c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
185d0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
185e0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
185f0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
18600 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18610 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
18620 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
18630 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
18640 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
18650 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
18660 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
18670 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
18680 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
18690 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
186a0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
186b0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
186c0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
186d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
186e0 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
186f0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
18700 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
18710 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
18720 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
18730 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
18740 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
18750 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
18760 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
18770 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
18780 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
18790 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
187a0 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
187b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
187c0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
187d0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
187e0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
187f0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
18800 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
18810 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
18820 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
18830 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
18840 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
18850 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
18860 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
18870 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
18880 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
18890 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
188a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
188b0 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
188c0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
188d0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
188e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
188f0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
18900 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
18910 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
18920 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
18930 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
18940 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
18950 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
18960 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
18970 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
18980 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69  vacuum-on-commmi
18990 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
189a0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
189b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
189c0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
189d0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
189e0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
189f0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
18a00 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
18a10 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
18a20 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
18a30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18a40 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
18a50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
18a60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18a80 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
18a90 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
18aa0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
18ab0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
18ac0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
18ad0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
18ae0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
18af0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18b00 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
18b10 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
18b20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
18b30 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18b40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18b50 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
18b60 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
18b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
18b80 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
18b90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
18ba0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
18bb0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
18bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18bf0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
18c00 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
18c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18c20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18c30 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
18c40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
18c50 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
18c60 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
18c70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
18c80 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
18c90 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
18ca0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
18cb0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
18cc0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
18cd0 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
18ce0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
18cf0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
18d00 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
18d10 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
18d20 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
18d30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
18d40 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
18d50 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
18d60 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
18d70 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
18d80 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
18d90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
18da0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
18db0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
18dc0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
18dd0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
18de0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
18df0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
18e00 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
18e10 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
18e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18e50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
18e60 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
18e70 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
18e80 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
18e90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
18ea0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
18eb0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
18ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18ed0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
18ee0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
18ef0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
18f00 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
18f10 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
18f20 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
18f30 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
18f40 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
18f50 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
18f60 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
18f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
18f80 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
18f90 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
18fa0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
18fb0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
18fc0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
18fd0 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
18fe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19010 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
19020 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
19030 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
19040 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
19050 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
19060 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
19070 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
19080 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
19090 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
190a0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
190b0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
190c0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
190d0 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
190e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
190f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
19100 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
19110 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
19120 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
19130 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
19140 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
19150 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
19160 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
19170 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
19180 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
19190 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
191a0 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
191b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
191c0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
191d0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
191e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
191f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
19200 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
19210 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
19220 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
19230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19240 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
19250 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
19260 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19270 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
19280 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
19290 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
192a0 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
192b0 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
192c0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
192d0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
192e0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
192f0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
19300 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
19310 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
19320 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
19330 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
19340 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
19350 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
19360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19370 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19380 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
19390 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
193a0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
193b0 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
193c0 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
193d0 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
193e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
193f0 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
19400 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
19410 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
19420 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
19430 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
19440 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
19450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19460 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
19470 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
19480 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19490 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
194a0 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
194b0 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
194c0 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
194d0 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
194e0 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
194f0 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
19500 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
19510 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
19520 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
19530 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
19540 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
19550 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
19560 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
19570 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
19580 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
195a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
195b0 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
195c0 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
195d0 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
195e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
195f0 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
19600 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
19610 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
19620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19630 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19640 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
19650 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
19660 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
19670 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
19680 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
19690 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
196a0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
196b0 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
196c0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
196d0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
196e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
196f0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
19700 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
19710 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
19720 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
19730 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
19740 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
19750 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19760 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
19770 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
19780 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
19790 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
197a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
197b0 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
197c0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
197d0 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
197e0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
197f0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
19800 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
19810 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
19820 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
19830 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
19840 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
19850 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
19860 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
19870 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
19880 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
19890 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
198a0 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
198b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
198c0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
198d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
198e0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
198f0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
19900 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
19910 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
19920 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19930 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19940 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
19950 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
19960 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
19970 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
19980 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
19990 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
199a0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
199b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
199c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
199d0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
199e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
199f0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
19a00 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
19a10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
19a20 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
19a30 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
19a40 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
19a50 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
19a60 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
19a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
19a80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19a90 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
19aa0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
19ab0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
19ac0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
19ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19ae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
19af0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
19b00 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
19b10 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
19b20 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
19b30 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
19b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
19b50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19b60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19b80 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
19b90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
19ba0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
19bb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
19bc0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
19bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
19be0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
19bf0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19c00 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
19c10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19c20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19c30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19c40 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
19c50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
19c60 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
19c70 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
19c80 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
19c90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
19ca0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
19cb0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19cc0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
19cd0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
19ce0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
19cf0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
19d00 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
19d10 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
19d20 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
19d30 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
19d40 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
19d50 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
19d60 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
19d70 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
19d80 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
19d90 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
19da0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
19db0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
19dc0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
19dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19de0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19df0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
19e00 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
19e10 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
19e20 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
19e30 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
19e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19e50 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19e60 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
19e70 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
19e80 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
19e90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
19ea0 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
19eb0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
19ec0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
19ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19ee0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
19ef0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
19f00 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
19f10 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
19f20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19f30 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
19f40 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
19f50 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
19f60 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
19f70 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
19f80 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
19f90 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
19fa0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
19fb0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
19fc0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
19fd0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
19fe0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
19ff0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1a000 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1a010 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1a020 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1a030 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1a040 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1a050 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1a060 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1a070 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1a080 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1a090 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1a0a0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1a0b0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1a0c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a0d0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1a0e0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1a0f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1a100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a110 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1a120 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1a130 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1a140 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1a150 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1a160 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1a170 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1a180 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1a190 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1a1a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1a1b0 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1a1c0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1a1d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1a1e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1a1f0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1a200 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1a210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1a220 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1a230 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1a240 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1a250 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1a260 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1a270 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1a280 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1a290 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1a2a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1a2b0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1a2c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1a2d0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1a2e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1a2f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1a300 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1a310 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1a320 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1a330 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a340 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1a350 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1a360 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1a370 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1a380 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1a390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a3a0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1a3b0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1a3c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1a3d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1a3e0 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1a3f0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1a400 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1a410 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1a420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a430 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1a440 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1a450 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1a460 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1a470 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1a480 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1a490 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1a4a0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1a4b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1a4c0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1a4d0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1a4e0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1a4f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1a500 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1a510 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1a520 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1a530 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1a540 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1a550 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1a560 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1a570 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1a580 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1a590 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1a5a0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1a5b0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1a5c0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1a5d0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1a5e0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1a5f0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1a600 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1a610 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1a620 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1a630 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1a640 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1a650 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1a660 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1a670 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1a680 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1a690 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1a6a0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1a6b0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1a6c0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1a6d0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1a6e0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1a6f0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1a700 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a710 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1a720 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1a730 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1a740 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1a750 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1a760 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1a770 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1a780 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1a790 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1a7a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1a7b0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1a7c0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1a7d0 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1a7e0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1a7f0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1a800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1a810 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1a820 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1a830 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1a840 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1a850 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1a860 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1a870 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1a880 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1a890 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1a8a0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1a8b0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1a8c0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1a8d0 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1a8e0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1a8f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1a900 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1a910 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1a920 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1a930 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1a940 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1a950 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1a960 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1a970 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1a980 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1a990 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1a9a0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1a9b0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1a9c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1a9d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1a9e0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1a9f0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1aa00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1aa10 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1aa20 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1aa30 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1aa40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1aa50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1aa60 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1aa70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1aa80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1aa90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1aaa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1aab0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1aac0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1aad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1aae0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1aaf0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ab00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ab10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ab20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1ab30 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1ab40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1ab50 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1ab60 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1ab70 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1ab80 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1ab90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1aba0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1abb0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1abc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1abd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1abe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1abf0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ac00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1ac10 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1ac20 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1ac30 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1ac40 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1ac50 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1ac60 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1ac70 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1ac80 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1ac90 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1aca0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1acb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1acc0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1acd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1ace0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1acf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ad00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1ad10 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ad20 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1ad30 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1ad40 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1ad50 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1ad60 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1ad70 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1ad80 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1ad90 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1ada0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1adb0 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1adc0 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1add0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1ade0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1adf0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1ae00 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1ae10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1ae20 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1ae30 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1ae40 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1ae50 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1ae60 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1ae70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1ae80 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1ae90 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1aea0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1aeb0 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1aec0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1aed0 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1aee0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1aef0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1af00 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1af10 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1af20 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1af30 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1af40 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1af50 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1af60 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1af70 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1af80 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1af90 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1afa0 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1afb0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1afc0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1afd0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1afe0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1aff0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1b000 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1b010 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b020 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1b030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b040 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1b050 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1b060 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1b070 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1b080 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1b090 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1b0a0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1b0b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1b0c0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1b0d0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1b0e0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1b0f0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1b100 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1b110 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1b120 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1b130 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1b140 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1b150 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1b160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1b170 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1b180 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1b190 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1b1a0 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1b1b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1b1c0 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1b1d0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1b1e0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1b1f0 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1b200 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1b210 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1b220 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b230 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1b240 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1b250 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1b260 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1b270 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1b280 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1b290 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1b2a0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1b2b0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1b2c0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1b2d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1b2e0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1b2f0 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1b300 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1b310 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1b320 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1b330 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1b340 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1b350 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1b360 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1b370 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1b380 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1b390 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1b3a0 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1b3b0 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1b3c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1b3d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1b3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1b3f0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1b400 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1b410 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1b420 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1b430 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1b440 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1b450 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1b460 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1b470 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1b480 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1b490 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1b4a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1b4b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b4c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b4d0 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1b4e0 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1b4f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b500 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1b510 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1b520 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1b530 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1b540 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1b550 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1b560 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1b570 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1b580 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1b590 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1b5a0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1b5b0 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1b5c0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1b5d0 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1b5e0 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1b5f0 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1b600 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1b610 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1b620 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1b630 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1b640 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1b650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b660 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1b670 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1b680 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1b690 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1b6a0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1b6b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b6c0 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1b6d0 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1b6e0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b6f0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1b700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b710 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b720 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1b730 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1b740 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1b750 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1b760 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1b770 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1b780 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1b790 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1b7a0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1b7b0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1b7c0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1b7d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b7e0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1b7f0 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1b800 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1b820 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b830 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b840 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1b850 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1b860 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1b870 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1b880 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1b890 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1b8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1b8b0 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1b8c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1b8d0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1b8e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b8f0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1b900 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1b910 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1b920 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1b930 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1b940 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1b950 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b960 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b980 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1b990 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1b9a0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1b9b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1b9c0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1b9d0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1b9e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1b9f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1ba00 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1ba10 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1ba20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1ba30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ba40 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1ba50 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1ba60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ba70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ba80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ba90 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1baa0 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1bab0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1bac0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1bad0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1bae0 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65  ursor on BtShare
1baf0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
1bb00 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
1bb10 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
1bb20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  is tripped, incl
1bb30 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68  uding cursors th
1bb40 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  at belong.** to 
1bb50 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1bb60 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1bb70 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61  happen to be sha
1bb80 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68  ring.** the cach
1bb90 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1bba0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bbb0 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1bbc0 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1bbd0 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72  curs..** All cur
1bbe0 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73  sors using the s
1bbf0 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62  ame cache must b
1bc00 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20  e tripped.** to 
1bc10 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f  prevent them fro
1bc20 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20  m trying to use 
1bc30 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a  the btree after.
1bc40 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ** the rollback.
1bc50 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d    The rollback m
1bc60 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20  ay have deleted 
1bc70 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76  tables.** or mov
1bc80 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73  ed root pages, s
1bc90 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
1bca0 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76  icient to.** sav
1bcb0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
1bcc0 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
1bcd0 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a  cursor must be.*
1bce0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  * invalidated..*
1bcf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1bd00 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1bd10 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1bd20 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20   int errCode){. 
1bd30 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1bd40 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20  if( pBtree==0 ) 
1bd50 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1bd60 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1bd70 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
1bd80 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
1bd90 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1bda0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1bdb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1bdc0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
1bdd0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
1bde0 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
1bdf0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
1be00 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
1be10 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
1be20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1be30 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
1be40 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
1be50 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
1be60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1be70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1be80 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
1be90 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
1bea0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1beb0 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
1bec0 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
1bed0 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
1bee0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
1bef0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
1bf00 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
1bf10 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
1bf20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
1bf30 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
1bf40 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
1bf50 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
1bf60 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1bf70 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1bf80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1bf90 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1bfa0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1bfb0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1bfc0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1bfd0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1bfe0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
1bff0 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69  back(Btree *p, i
1c000 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
1c010 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1c020 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c030 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1c040 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1c050 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1c060 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
1c070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c080 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
1c090 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1c0a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  t, 0, 0);.  }els
1c0b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1c0c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1c0d0 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1c0e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1c0f0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
1c100 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20  ripCode);.  }.  
1c110 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1c120 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
1c130 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c140 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
1c150 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
1c160 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
1c170 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1c180 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
1c190 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1c1a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1c1b0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
1c1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c1d0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
1c1e0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
1c1f0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
1c200 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
1c210 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
1c220 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
1c230 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
1c240 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
1c250 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
1c260 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
1c270 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
1c280 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
1c290 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1c2a0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
1c2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c2c0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
1c2d0 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
1c2e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
1c2f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c300 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1c310 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1c320 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1c330 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1c340 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1c350 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
1c360 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
1c370 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1c380 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
1c390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1c3a0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
1c3b0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
1c3c0 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
1c3d0 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
1c3e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1c3f0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1c400 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1c410 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1c420 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1c430 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1c440 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c450 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
1c470 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
1c480 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1c490 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
1c4a0 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
1c4b0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
1c4c0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
1c4d0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
1c4e0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
1c4f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1c500 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
1c510 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
1c520 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1c530 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
1c540 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
1c550 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
1c560 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
1c570 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
1c580 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
1c590 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
1c5a0 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
1c5b0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
1c5c0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
1c5d0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
1c5e0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
1c5f0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
1c600 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
1c610 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
1c620 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
1c630 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
1c640 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
1c650 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
1c660 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
1c670 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
1c680 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
1c690 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
1c6a0 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
1c6b0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
1c6c0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
1c6d0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
1c6e0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
1c6f0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
1c700 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
1c710 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
1c720 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
1c730 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
1c740 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
1c750 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1c760 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
1c770 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
1c780 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1c790 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
1c7a0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
1c7b0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
1c7c0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
1c7d0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
1c7e0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
1c7f0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
1c800 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
1c810 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
1c820 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
1c830 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
1c840 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1c850 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1c860 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
1c870 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
1c880 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1c890 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c8a0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
1c8b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1c8c0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1c8d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1c8e0 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
1c8f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1c900 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
1c910 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1c920 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
1c930 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
1c940 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1c950 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1c960 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c970 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1c980 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
1c990 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
1c9a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1c9b0 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
1c9c0 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
1c9d0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
1c9e0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
1c9f0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
1ca00 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
1ca10 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
1ca20 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
1ca30 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
1ca40 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
1ca50 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
1ca60 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
1ca70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1ca80 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
1ca90 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
1caa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cab0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
1cac0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
1cad0 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
1cae0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1caf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cb00 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
1cb10 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1cb20 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
1cb30 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
1cb40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
1cb50 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
1cb60 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
1cb70 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
1cb80 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
1cb90 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
1cba0 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
1cbb0 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
1cbc0 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
1cbd0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
1cbe0 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
1cbf0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
1cc00 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
1cc10 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1cc20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
1cc30 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
1cc40 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
1cc50 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
1cc60 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
1cc70 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1cc80 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1cc90 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1cca0 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
1ccb0 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
1ccc0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
1ccd0 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
1cce0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
1ccf0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
1cd00 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
1cd10 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1cd20 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
1cd30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1cd40 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
1cd50 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1cd60 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
1cd70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cd80 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
1cd90 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1cda0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1cdb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1cdc0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1cdd0 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
1cde0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
1cdf0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1ce00 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1ce10 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
1ce20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
1ce30 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
1ce40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
1ce50 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ce60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
1ce70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ce80 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1ce90 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
1cea0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
1ceb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cec0 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65  .      if( iSave
1ced0 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d  point<0 && (pBt-
1cee0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1cef0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29  INITIALLY_EMPTY)
1cf00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1cf10 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1cf20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1cf30 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1cf40 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  t);.      pBt->n
1cf50 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1cf60 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31  28 + pBt->pPage1
1cf70 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->aData);..     
1cf80 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1cf90 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65   size was writte
1cfa0 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65  n into the offse
1cfb0 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64  t 28 of the head
1cfc0 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  er.      ** when
1cfd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cfe0 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20   started, so we 
1cff0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61  know that the va
1d000 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20  lue at offset.  
1d010 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e      ** 28 is non
1d020 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61  zero. */.      a
1d030 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
1d040 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e>0 );.    }.   
1d050 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1d060 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1d070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d080 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
1d090 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
1d0a0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
1d0b0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
1d0c0 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
1d0d0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
1d0e0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1d0f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
1d100 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
1d110 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
1d120 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
1d130 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
1d140 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
1d150 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
1d160 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
1d170 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
1d180 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1d190 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
1d1a0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
1d1b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1d1c0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
1d1d0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1d1e0 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
1d1f0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
1d200 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
1d210 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1d220 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
1d230 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
1d240 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
1d250 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
1d260 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
1d270 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
1d280 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
1d290 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
1d2a0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
1d2b0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
1d2c0 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
1d2d0 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
1d2e0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1d2f0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
1d300 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
1d310 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
1d320 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1d330 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
1d340 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
1d350 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
1d360 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
1d370 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
1d380 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
1d390 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
1d3a0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
1d3b0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
1d3c0 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
1d3d0 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
1d3e0 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
1d3f0 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
1d400 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
1d410 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
1d420 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
1d430 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1d440 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
1d450 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
1d460 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
1d470 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
1d480 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
1d490 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
1d4a0 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
1d4b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1d4c0 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
1d4d0 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
1d4e0 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
1d4f0 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
1d500 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
1d510 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
1d520 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
1d530 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
1d540 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
1d550 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
1d560 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
1d570 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
1d580 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1d590 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  ro() has been ca
1d5a0 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20  lled.** on pCur 
1d5b0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
1d5c0 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70  e memory space p
1d5d0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1d5e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1d5f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
1d600 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1d610 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1d640 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d670 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1d680 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1d690 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
1d6c0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
1d6d0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
1d6e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d700 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
1d710 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
1d720 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1d730 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d750 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
1d760 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  rsor */.){.  BtS
1d770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1d780 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1d790 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d      /* Shared b-
1d7a0 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a  tree handle */..
1d7b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d7c0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1d7d0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1d7e0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
1d7f0 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  Flag==1 );..  /*
1d800 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1d810 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
1d820 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
1d830 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
1d840 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
1d850 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
1d860 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
1d870 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
1d880 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
1d890 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
1d8a0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1d8b0 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
1d8c0 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
1d8d0 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
1d8e0 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
1d8f0 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
1d900 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1d910 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
1d920 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31  nfo!=0, wrFlag+1
1d930 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1d940 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
1d950 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
1d960 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
1d970 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
1d980 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
1d990 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
1d9a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
1d9b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1d9c0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1d9d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1d9e0 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
1d9f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1da00 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1da10 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
1da20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1da30 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  a );..  if( NEVE
1da40 52 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74  R(wrFlag && (pBt
1da50 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1da60 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20  _READ_ONLY)!=0) 
1da70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1da80 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1da90 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1daa0 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
1dab0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1dac0 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
1dad0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
1dae0 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
1daf0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1db00 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1db10 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1db20 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1db30 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1db40 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1db50 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1db60 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1db70 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1db80 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1db90 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1dba0 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1dbb0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1dbc0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1dbd0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1dbe0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1dbf0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1dc00 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1dc10 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1dc20 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1dc30 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1dc40 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1dc50 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1dc60 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1dc70 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1dc80 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1dc90 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1dca0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1dcb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1dcc0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1dcd0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1dce0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd10 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1dd20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1dd50 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1dd60 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1dd70 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1dda0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1ddb0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1ddc0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1ddd0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1dde0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1ddf0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1de00 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1de10 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1de40 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1de50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1de60 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1de70 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1de80 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1de90 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1dea0 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1deb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1dec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ded0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1dee0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1def0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1df00 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1df10 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1df20 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1df30 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1df40 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1df50 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1df60 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1df70 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1df80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1df90 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1dfa0 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1dfb0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1dfc0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1dfd0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1dfe0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1dff0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e000 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1e010 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1e020 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1e030 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1e040 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1e050 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1e060 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1e070 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1e080 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1e090 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1e0a0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1e0b0 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1e0c0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1e0d0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1e0e0 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1e0f0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1e100 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1e110 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1e120 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1e130 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1e140 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1e150 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1e160 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1e170 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1e180 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1e190 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e1a0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1e1b0 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1e1c0 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1e1d0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1e1e0 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1e1f0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1e200 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1e210 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1e220 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1e230 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1e240 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1e250 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1e260 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1e270 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1e280 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1e290 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1e2a0 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1e2b0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1e2c0 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1e2d0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1e2e0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1e2f0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1e300 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1e310 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1e320 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1e330 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1e340 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1e350 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1e360 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1e370 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1e380 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1e390 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1e3a0 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1e3b0 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1e3c0 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1e3d0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1e3e0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1e3f0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1e400 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1e410 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1e420 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1e430 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1e440 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1e450 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1e460 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1e470 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1e480 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1e490 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1e4a0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1e4b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1e4c0 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1e4d0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1e4e0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1e4f0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1e500 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1e510 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1e520 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1e530 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1e540 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1e550 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1e560 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1e570 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1e580 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1e590 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1e5a0 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1e5b0 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1e5c0 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1e5d0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1e5e0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1e5f0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1e600 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1e610 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1e620 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1e630 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1e640 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1e650 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1e660 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1e670 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1e680 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1e690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e6a0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1e6b0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1e6c0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1e6d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e6e0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1e6f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e700 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1e710 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1e720 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1e730 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e740 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e750 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1e760 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e770 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1e780 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1e790 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1e7a0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1e7b0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1e7c0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1e7d0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1e7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1e7f0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1e800 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1e810 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1e820 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1e830 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1e840 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1e850 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1e860 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1e870 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1e880 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1e890 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1e8a0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1e8b0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1e8c0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1e8d0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1e8e0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1e8f0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1e900 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e910 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1e920 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e940 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1e950 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1e960 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1e970 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1e980 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1e990 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1e9a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1e9b0 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1e9c0 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1e9d0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1e9e0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1e9f0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1ea00 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1ea10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1ea20 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1ea30 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1ea40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1ea50 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1ea60 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1ea70 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1ea80 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1ea90 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1eaa0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1eab0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1eac0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1ead0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1eae0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1eaf0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1eb00 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1eb10 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1eb20 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1eb30 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1eb40 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1eb50 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1eb60 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1eb70 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1eb80 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1eb90 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1eba0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1ebb0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1ebc0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1ebd0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1ebe0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1ebf0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1ec00 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1ec10 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1ec20 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1ec30 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1ec40 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1ec50 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1ec60 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1ec70 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1ec80 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1ec90 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1eca0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1ecb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1ecc0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1ecd0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1ecf0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1ed00 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1ed10 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1ed20 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1ed30 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1ed40 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1ed50 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1ed60 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1ed70 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1ed80 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1ed90 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1eda0 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1edb0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1edc0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1edd0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1ede0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1edf0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1ee00 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1ee10 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1ee20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1ee30 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1ee40 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1ee50 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1ee60 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1ee70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ee80 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ee90 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1eea0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1eeb0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1eec0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1eed0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1eee0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1eef0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1ef00 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1ef10 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1ef20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1ef60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1ef70 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1efb0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1efc0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eff0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1f000 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1f010 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1f020 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1f030 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1f040 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1f050 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1f0f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1f140 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1f150 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
1f160 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
1f170 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
1f180 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1f190 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
1f1a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1f1b0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
1f1c0 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
1f1d0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
1f1e0 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
1f1f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1f200 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
1f210 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
1f220 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
1f230 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
1f240 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1f250 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1f260 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1f270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f280 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1f290 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1f2a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1f2b0 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
1f2c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
1f2d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
1f2e0 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
1f2f0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1f300 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1f310 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
1f320 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
1f330 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
1f340 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
1f350 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1f360 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
1f370 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
1f380 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
1f390 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
1f3a0 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
1f3b0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
1f3c0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
1f3d0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
1f3e0 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
1f3f0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1f400 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1f410 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1f420 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
1f430 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
1f440 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1f450 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
1f460 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f470 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
1f480 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1f490 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
1f4a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f4b0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1f4c0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1f4d0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1f4e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f4f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f500 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f510 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1f520 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1f530 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f540 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1f550 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
1f560 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20  D ){.    *pSize 
1f570 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1f580 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1f590 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ur);.    *pSize 
1f5a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1f5b0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1f5c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f5d0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1f5e0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1f5f0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1f600 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1f610 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1f620 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
1f630 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1f640 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
1f650 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1f660 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
1f670 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
1f680 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
1f690 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
1f6a0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
1f6b0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
1f6c0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1f6d0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
1f6e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f6f0 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
1f700 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1f710 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
1f720 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1f730 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
1f740 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
1f750 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
1f760 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
1f770 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
1f780 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
1f790 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
1f7a0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
1f7b0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
1f7c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f7d0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1f7e0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1f7f0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1f800 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f810 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f820 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f830 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f840 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1f850 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1f860 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1f870 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53  Data;.  return S
1f880 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f890 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1f8a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1f8b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1f8d0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1f8e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f8f0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1f900 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1f910 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1f920 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1f930 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1f940 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1f950 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1f960 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1f970 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1f980 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1f990 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1f9a0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1f9b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f9c0 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1f9d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1f9e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f9f0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1fa00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1fa10 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1fa20 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1fa30 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1fa40 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1fa50 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1fa60 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1fa70 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1fa80 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1fa90 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1faa0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1fab0 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1fac0 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1fad0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1fae0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1faf0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1fb00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1fb10 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1fb20 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1fb30 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1fb40 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1fb50 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1fb60 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1fb70 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1fb80 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1fb90 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1fba0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1fbb0 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1fbc0 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1fbd0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1fbe0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1fbf0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1fc00 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1fc10 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1fc20 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1fc30 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1fc40 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1fc50 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1fc60 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1fc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fc80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fc90 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcb0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
1fcc0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1fcd0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
1fce0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
1fcf0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
1fd00 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
1fd10 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
1fd20 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
1fd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1fd40 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
1fd50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1fd60 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
1fd70 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1fd80 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
1fd90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fda0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fdb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1fdc0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1fdd0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
1fde0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fdf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fe00 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
1fe10 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
1fe20 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1fe30 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
1fe40 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
1fe50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1fe60 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
1fe70 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
1fe80 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
1fe90 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
1fea0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
1feb0 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
1fec0 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
1fed0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
1fee0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
1fef0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
1ff00 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
1ff10 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
1ff20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
1ff30 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
1ff40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ff50 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1ff60 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
1ff70 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
1ff80 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
1ff90 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1ffa0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
1ffb0 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
1ffc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ffd0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
1ffe0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
1fff0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
20000 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
20010 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
20020 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
20030 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
20040 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
20050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20060 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
20070 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
20080 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
20090 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
200a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
200b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
200c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
200d0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
200e0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
200f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
20100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20110 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
20120 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
20130 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
20140 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
20150 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
20160 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
20170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
20180 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
20190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
201a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
201b0 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
201c0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
201d0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
201e0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
201f0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
20200 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
20210 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
20220 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
20230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
20240 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
20250 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
20260 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
20270 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
20280 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
20290 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
202a0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
202b0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
202c0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
202d0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
202e0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
202f0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
20300 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
20310 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
20320 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
20330 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
20340 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
20350 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
20360 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
20370 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
20380 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
20390 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
203a0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
203b0 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
203c0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
203d0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
203e0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
203f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20400 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
20410 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
20420 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
20430 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
20440 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
20450 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
20460 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
20470 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
20480 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
20490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
204a0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
204b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
204e0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
204f0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
20500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
20510 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
20520 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
20530 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
20540 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
20550 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
20560 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
20570 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
20580 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
20590 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
205a0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
205b0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
205c0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
205d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
205e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
205f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20600 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20610 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
20620 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
20630 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
20640 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
20650 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
20660 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
20670 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
20680 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
20690 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
206a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
206b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
206c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
206d0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
206e0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
206f0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
20700 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
20710 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
20720 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
20730 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
20740 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
20750 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
20760 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
20770 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
20780 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
20790 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
207a0 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
207b0 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
207c0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
207d0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
207e0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
207f0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
20800 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
20810 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
20820 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
20830 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
20840 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
20850 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
20860 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
20870 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
20880 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
20890 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
208a0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
208b0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
208c0 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
208d0 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
208e0 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
208f0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
20900 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
20910 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
20920 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
20930 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
20940 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
20950 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
20960 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
20970 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20980 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
20990 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
209a0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
209b0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
209c0 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
209d0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
209e0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
209f0 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
20a00 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
20a10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
20a20 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
20a30 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
20a40 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
20a50 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
20a60 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
20a70 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
20a80 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
20a90 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20aa0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
20ab0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
20ac0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
20ad0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
20ae0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
20af0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
20b00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20b10 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
20b20 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
20b30 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
20b40 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
20b50 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
20b60 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
20b70 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
20b80 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
20b90 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
20ba0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
20bb0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
20bc0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
20bd0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
20be0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
20bf0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
20c00 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
20c10 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
20c20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
20c30 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
20c40 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
20c50 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
20c60 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
20c70 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
20c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
20c90 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
20ca0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
20cb0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
20cc0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
20cd0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
20ce0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
20cf0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
20d00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
20d10 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
20d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
20d30 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
20d40 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
20d50 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
20d60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20d70 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
20d80 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
20d90 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
20da0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20db0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
20dc0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
20dd0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
20de0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
20df0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
20e00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20e10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20e20 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20e30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20e40 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
20e50 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
20e60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20e70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
20e80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
20e90 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
20ea0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
20eb0 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
20ec0 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
20ed0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
20ee0 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
20ef0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
20f00 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
20f10 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
20f20 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
20f30 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
20f40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
20f50 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
20f60 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
20f70 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
20f80 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
20f90 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
20fa0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
20fb0 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
20fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20fd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20fe0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
20ff0 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
21000 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
21010 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
21020 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
21030 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
21040 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
21050 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
21060 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
21070 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
21080 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
21090 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
210a0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
210b0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
210c0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
210d0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
210e0 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
210f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
21100 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
21110 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
21120 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
21130 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
21140 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
21150 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
21160 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
21170 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
21180 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
21190 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
211a0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
211b0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
211c0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
211d0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
211e0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
211f0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
21200 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
21210 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21220 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
21230 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
21240 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
21250 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
21260 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
21270 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
21280 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
21290 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
212a0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
212b0 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
212c0 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
212d0 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
212e0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
212f0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
21300 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
21310 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
21320 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
21330 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
21340 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
21350 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
21360 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
21370 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
21380 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
21390 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
213a0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
213b0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
213c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
213d0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
213e0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
213f0 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
21400 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
21410 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
21420 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
21430 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
21440 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
21450 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
21460 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
21470 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
21480 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
21490 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
214a0 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
214b0 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
214c0 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
214d0 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
214e0 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
214f0 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
21500 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
21510 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
21520 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
21530 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
21540 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
21550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21560 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
21570 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21580 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
21590 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
215a0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
215b0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
215c0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
215d0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
215e0 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
215f0 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
21600 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
21610 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
21620 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
21630 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
21640 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
21650 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
21660 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
21670 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
21680 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
21690 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
216a0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
216b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
216c0 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
216d0 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
216e0 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
216f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21700 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
21710 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
21720 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
21730 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
21740 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
21750 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
21760 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
21770 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
21780 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21790 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
217a0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
217b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
217c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
217d0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
217e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
217f0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
21800 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
21810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
21820 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
21830 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
21840 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
21850 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
21860 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
21870 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
21880 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
21890 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
218a0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
218b0 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
218c0 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
218d0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
218e0 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
218f0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
21900 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
21910 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
21920 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
21930 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
21940 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
21950 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
21960 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
21970 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
21980 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
21990 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
219a0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
219b0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
219c0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
219d0 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
219e0 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
219f0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
21a00 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
21a10 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
21a20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
21a30 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
21a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21a50 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
21a60 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
21a70 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
21a80 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
21a90 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
21aa0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
21ab0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
21ac0 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
21ad0 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
21ae0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21af0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21b00 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
21b10 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
21b20 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
21b30 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
21b40 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
21b50 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
21b60 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
21b70 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
21b80 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
21b90 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
21ba0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
21bb0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
21bc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21bd0 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
21be0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
21bf0 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
21c00 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
21c10 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
21c20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
21c30 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
21c40 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
21c50 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
21c60 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
21c70 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
21c80 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
21c90 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
21ca0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
21cb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21cc0 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
21cd0 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
21ce0 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
21cf0 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
21d00 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
21d10 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
21d20 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
21d30 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21d40 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
21d50 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
21d60 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
21d70 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
21d80 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
21d90 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
21da0 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
21db0 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
21dc0 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
21dd0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
21de0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21df0 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20   if( eOp==0     
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
21e30 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
21e40 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
21e80 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
21e90 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
21ea0 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
21eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
21ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
21ed0 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
21ee0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
21ef0 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
21f00 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
21f10 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
21f20 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
21f30 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
21f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
21f50 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
21f60 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
21f70 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
21f80 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
21f90 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
21fa0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
21fb0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
21fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21fd0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
21fe0 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
21ff0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
22000 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
22010 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
22020 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
22030 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
22040 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
22050 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
22060 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
22070 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
22080 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
22090 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
220a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
220b0 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
220c0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
220d0 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
220e0 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20        (eOp==0 ? 
220f0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22100 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
22110 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
22120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22140 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
22150 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
22160 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22170 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
22180 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
22190 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
221a0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
221b0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
221c0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
221d0 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
221e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
221f0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
22200 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
22210 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
22220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22230 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
22240 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
22250 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
22260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
22270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22280 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
22290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
222a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
222b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
222c0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
222d0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
222e0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
222f0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
22300 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
22310 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
22320 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
22330 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
22340 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
22350 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
22360 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
22370 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
22380 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
22390 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
223a0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
223b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
223c0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
223d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
223e0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
223f0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
22400 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
22410 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
22420 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
22430 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
22440 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
22450 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
22460 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
22470 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
22480 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
22490 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
224a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
224b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
224c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
224d0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
224e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
224f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22520 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22530 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
22540 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22550 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
22560 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
22570 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
22580 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
22590 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
225a0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
225b0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
225c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
225d0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
225e0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
225f0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
22600 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
22610 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
22620 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
22630 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
22640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
22650 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
22660 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
22670 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
22680 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
22690 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
226a0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
226b0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
226c0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
226d0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
226e0 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
226f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
22700 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
22710 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
22720 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
22730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
22740 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
22750 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22760 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
22770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
22780 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
22790 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
227a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
227b0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
227c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
227d0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
227e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22800 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22810 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
22820 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22830 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
22840 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22850 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
22860 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
22870 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
22880 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22890 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
228a0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
228b0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
228c0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
228d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
228e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
228f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22900 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
22910 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
22920 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
22930 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
22940 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
22950 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
22960 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
22970 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
22980 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
22990 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
229a0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
229b0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
229c0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
229d0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
229e0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
229f0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
22a00 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
22a10 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
22a20 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
22a30 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
22a40 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
22a50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22a60 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
22a70 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
22a80 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
22a90 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
22aa0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
22ab0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
22ac0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
22ad0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
22ae0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
22af0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
22b00 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
22b10 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
22b20 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
22b30 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
22b40 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
22b50 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
22b60 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
22b70 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
22b80 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
22b90 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
22ba0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
22bb0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
22bc0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
22bd0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
22be0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
22bf0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
22c00 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
22c10 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
22c20 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
22c30 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
22c40 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
22c50 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
22c60 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
22c70 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
22c80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22c90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
22ca0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
22cb0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
22cc0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22cd0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
22ce0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
22cf0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
22d00 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 2c   */.  u32 *pAmt,
22d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22d20 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
22d30 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
22d40 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
22d50 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
22d60 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
22d70 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
22d80 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
22d90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
22da0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
22db0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
22dc0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
22dd0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
22de0 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
22df0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
22e00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22e10 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
22e20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22e30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
22e50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22e60 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
22e70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
22e80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
22e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
22ea0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
22eb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
22ec0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
22ed0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
22ee0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
22ef0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22f00 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  r->iPage], pCur-
22f10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22f20 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
22f30 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69          &pCur->i
22f40 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79  nfo);.  }.  aPay
22f50 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
22f60 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
22f70 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
22f80 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
22f90 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
22fa0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
22fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
22fc0 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
22fd0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
22fe0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
22ff0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
23000 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
23010 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
23020 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
23030 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
23040 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
23050 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  cal;.    assert(
23060 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b   nLocal<=nKey );
23070 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
23080 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
23090 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
230a0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
230b0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
230c0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
230d0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
230e0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
230f0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
23100 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
23110 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
23120 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
23130 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
23140 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
23150 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
23160 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
23170 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
23180 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
23190 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
231a0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
231b0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
231c0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
231d0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
231e0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
231f0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
23200 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
23210 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
23220 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
23230 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
23240 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
23250 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
23260 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
23270 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
23280 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
23290 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
232a0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
232b0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
232c0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
232d0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
232e0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
232f0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
23300 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
23310 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
23320 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
23330 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
23340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23350 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
23360 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
23370 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23380 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23390 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
233a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
233b0 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
233c0 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
233d0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
233e0 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
233f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
23400 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
23410 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
23420 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
23430 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
23440 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
23450 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
23460 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23470 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
23480 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
23490 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
234a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
234b0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
234c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
234d0 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
234e0 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
234f0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
23500 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
23510 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
23520 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
23530 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
23540 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
23550 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
23560 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
23570 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
23580 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
23590 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
235a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
235b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
235c0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
235d0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
235e0 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
235f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
23600 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
23610 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
23620 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
23630 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
23640 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
23650 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
23660 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
23670 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
23680 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
23690 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
236a0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
236b0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
236c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
236d0 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
236e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
236f0 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
23700 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
23710 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
23720 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23730 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23740 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23750 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23760 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23770 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
23780 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
23790 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
237a0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
237b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
237c0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
237d0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
237e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
237f0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
23800 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
23810 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
23820 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20  NewPage,.       
23830 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 77 72          pCur->wr
23840 46 6c 61 67 3d 3d 30 20 3f 20 50 41 47 45 52 5f  Flag==0 ? PAGER_
23850 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
23860 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
23870 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
23880 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
23890 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
238a0 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
238b0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
238c0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
238d0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
238e0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
238f0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
23900 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
23910 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
23920 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
23930 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
23940 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23950 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23970 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
23980 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
23990 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
239a0 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
239b0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
239c0 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
239d0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
239e0 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
239f0 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
23a00 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
23a10 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
23a20 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
23a30 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
23a40 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
23a50 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
23a60 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
23a70 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
23a80 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
23a90 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
23aa0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
23ab0 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
23ac0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
23ad0 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
23ae0 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
23af0 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
23b00 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
23b10 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
23b20 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
23b30 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
23b40 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
23b50 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
23b60 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
23b70 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23b80 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
23b90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
23ba0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
23bb0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
23bc0 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
23bd0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
23be0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
23bf0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
23c00 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
23c10 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
23c20 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
23c30 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
23c40 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
23c50 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
23c60 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
23c70 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
23c80 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
23c90 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
23ca0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
23cb0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
23cc0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
23cd0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
23ce0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
23cf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
23d00 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
23d10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
23d20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23d30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23d40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23d50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23d60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
23d70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
23d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23d90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23da0 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a  >iPage] );..  /*
23db0 20 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61   UPDATE: It is a
23dc0 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
23dd0 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69   for the conditi
23de0 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65  on tested by the
23df0 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c   assert.  ** bel
23e00 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20  ow to be untrue 
23e10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
23e20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
23e30 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20   This can occur 
23e40 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73  if.  ** one curs
23e50 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20  or has modified 
23e60 70 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69  page pParent whi
23e70 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  le a reference t
23e80 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20  o it is held .  
23e90 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63  ** by a second c
23ea0 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e  ursor. Which can
23eb0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
23ec0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73  a single page is
23ed0 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74   linked.  ** int
23ee0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
23ef0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
23f00 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
23f10 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20  tabase.  */.#if 
23f20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  0.  assertParent
23f30 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
23f40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23f50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
23f60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23f70 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
23f80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23f90 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
23fa0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74  );.#endif.  test
23fb0 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
23fc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
23fd0 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
23fe0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
23ff0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65  nCell );..  rele
24000 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
24010 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24020 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
24030 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
24040 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
24050 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24060 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
24070 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
24080 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
24090 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
240a0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
240b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
240c0 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
240d0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
240e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
240f0 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
24100 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
24110 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
24120 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
24130 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
24140 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
24150 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
24160 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
24170 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
24180 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
24190 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
241a0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
241b0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
241c0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
241d0 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
241e0 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
241f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
24200 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
24210 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
24220 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
24230 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
24240 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
24250 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
24260 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
24270 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
24280 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
24290 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
242a0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
242b0 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
242c0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
242d0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
242e0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
242f0 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
24300 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
24310 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
24320 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
24330 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
24340 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
24350 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
24360 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
24370 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
24380 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
24390 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
243a0 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
243b0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
243c0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
243d0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
243e0 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
243f0 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
24400 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
24410 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
24420 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
24430 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
24440 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
24450 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
24460 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
24470 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
24480 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
24490 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
244a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
244b0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
244c0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
244d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
244e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
244f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24500 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
24510 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
24520 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
24530 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
24540 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
24550 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
24560 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
24570 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
24580 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
24590 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
245a0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
245b0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
245c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
245d0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
245e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
245f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
24600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
24610 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
24620 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
24630 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
24640 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
24650 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
24660 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
24670 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
24680 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61 73  ->iPage ) releas
24690 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
246a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
246b0 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
246c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
246d0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
246e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
246f0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
24700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24710 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
24720 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
24730 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
24740 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
24750 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
24760 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0],.            
24770 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
24780 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 3f 20 50 41  ->wrFlag==0 ? PA
24790 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
247a0 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
247b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
247c0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
247d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
247e0 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
247f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24800 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
24810 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72  ..    /* If pCur
24820 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
24830 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
24840 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
24850 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
24860 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20      ** expected 
24870 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
24880 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
24890 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
248a0 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20  yInfo is.    ** 
248b0 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
248c0 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
248d0 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
248e0 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
248f0 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  ,.    ** return 
24900 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
24910 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20  T error.  */.   
24920 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24930 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
24940 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==1 || pCur->apP
24950 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
24960 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43  0 );.    if( (pC
24970 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
24980 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  !=pCur->apPage[0
24990 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
249a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
249b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
249c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
249d0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72  ssert that the r
249e0 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74  oot page is of t
249f0 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e  he correct type.
24a00 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68   This must be th
24a10 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74  e.  ** case as t
24a20 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  he call to this 
24a30 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f  function that lo
24a40 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61  aded the root-pa
24a50 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20  ge (either.  ** 
24a60 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70  this call or a p
24a70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69  revious invocati
24a80 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64  on) would have d
24a90 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
24aa0 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  on .  ** if the 
24ab0 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20  assumption were 
24ac0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74  not true, and it
24ad0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
24ae0 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a   for the flags .
24af0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76    ** byte to hav
24b00 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
24b10 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f  while this curso
24b20 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
24b30 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f  eference.  ** to
24b40 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20   the page.  */. 
24b50 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
24b60 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
24b70 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
24b80 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
24b90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  );.  assert( pRo
24ba0 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70  ot->isInit && (p
24bb0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
24bc0 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )==pRoot->intKey
24bd0 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49   );..  pCur->aiI
24be0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
24bf0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24c00 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73  0;.  pCur->atLas
24c10 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  t = 0;.  pCur->v
24c20 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
24c30 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
24c40 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
24c50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24c60 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
24c70 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
24c80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
24c90 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
24ca0 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
24cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24cc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
24cd0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
24ce0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
24cf0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
24d00 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
24d10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24d20 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
24d30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
24d40 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
24d50 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
24d60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
24d70 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
24d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24d90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
24da0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
24db0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
24dc0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
24dd0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
24de0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
24df0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
24e00 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
24e10 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
24e20 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
24e30 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
24e40 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
24e50 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
24e60 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
24e70 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
24e80 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
24e90 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
24ea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
24eb0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
24ec0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24ed0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24ee0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24ef0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24f00 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
24f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24f20 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
24f30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24f40 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
24f50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24f60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24f70 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
24f80 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
24f90 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24fa0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
24fb0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24fc0 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
24fd0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24fe0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
24ff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25000 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
25010 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
25020 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
25030 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
25040 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
25050 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
25060 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
25070 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
25080 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
25090 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
250a0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
250b0 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
250c0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
250d0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
250e0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
250f0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
25100 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
25110 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
25120 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
25130 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
25140 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
25150 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
25160 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
25170 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
25180 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
25190 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
251a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
251b0 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
251c0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
251d0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
251e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
251f0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
25200 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
25210 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25220 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25230 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25240 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25250 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
25260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25270 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
25280 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25290 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
252a0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
252b0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
252c0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
252d0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
252e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
252f0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
25300 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
25310 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
25320 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
25330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25340 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
25350 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
25360 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
25370 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
25380 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
25390 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
253a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
253b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
253c0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
253d0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
253e0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
253f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
25400 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
25410 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
25420 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
25430 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
25440 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
25450 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
25460 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
25470 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
25480 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
25490 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
254a0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
254b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
254c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
254d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
254e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
254f0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
25500 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
25510 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
25520 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
25530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25540 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
25550 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
25560 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
25570 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25580 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25590 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
255a0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
255b0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
255c0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
255d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
255e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
255f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
25600 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25610 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25620 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
25630 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
25640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25650 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25660 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
25670 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
25680 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
25690 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
256a0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
256b0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
256c0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
256d0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
256e0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
256f0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
25700 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
25710 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
25720 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
25730 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
25740 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
25750 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25760 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25770 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25780 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
25790 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
257a0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
257b0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
257c0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
257d0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
257e0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
257f0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
25800 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25810 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61  te && pCur->atLa
25820 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  st ){.#ifdef SQL
25830 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
25840 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
25850 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
25860 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
25870 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
25880 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
25890 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
258a0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
258b0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
258c0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
258d0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
258e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
258f0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
25900 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
25910 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
25920 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25930 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25940 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
25950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25960 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
25970 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
25980 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25990 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
259a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
259b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
259c0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
259d0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
259e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
259f0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
25a00 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
25a10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25a20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
25a30 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
25a40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25a50 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
25a60 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
25a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25a80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25a90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25aa0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
25ab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
25ac0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
25ad0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
25ae0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
25af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b  =SQLITE_OK ?1:0;
25b00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
25b20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
25b30 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
25b40 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
25b50 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
25b60 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
25b70 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
25b80 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
25b90 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
25ba0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
25bb0 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
25bc0 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
25bd0 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
25be0 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
25bf0 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
25c00 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
25c10 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
25c20 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
25c30 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
25c40 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
25c50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
25c60 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
25c70 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
25c80 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
25c90 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
25ca0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
25cb0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
25cc0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
25cd0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
25ce0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
25cf0 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
25d00 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
25d10 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
25d20 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
25d30 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
25d40 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
25d50 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
25d60 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
25d70 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
25d80 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
25d90 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
25da0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
25db0 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
25dc0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
25dd0 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
25de0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
25df0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25e00 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
25e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
25e30 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
25e40 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
25e50 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
25e70 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
25e80 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
25e90 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
25ea0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
25eb0 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
25ec0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
25ed0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
25ee0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
25ef0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
25f00 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
25f10 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
25f20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
25f30 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25f40 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25f50 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
25f80 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
25f90 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
25fa0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
25fb0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
25fc0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
25fd0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
25fe0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
25ff0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
26000 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
26010 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
26020 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26040 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
26050 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
26060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
26070 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
26080 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
26090 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
260a0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
260b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
260c0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
260d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
260e0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
260f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26100 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26110 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
26120 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
26130 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
26140 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
26150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
26160 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
26170 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
26180 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
26190 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
261a0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
261b0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
261c0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
261d0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
261e0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
261f0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
26200 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
26210 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26220 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c  LID && pCur->val
26230 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43  idNKey .   && pC
26240 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
26250 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
26260 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
26270 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
26280 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
26290 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
262a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
262b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
262c0 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
262d0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
262e0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
262f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26300 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26310 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
26320 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
26330 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
26340 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
26350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
26360 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
26370 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26380 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
26390 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
263a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
263b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
263c0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
263d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
263e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
263f0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
26400 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26410 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
26420 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
26430 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
26440 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
26450 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
26460 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
26470 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
26480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
26490 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
264a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
264b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
264c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
264d0 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
264e0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
264f0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
26500 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
26510 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
26520 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
26530 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26540 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
26550 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26570 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
26580 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
26590 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
265a0 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
265b0 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
265c0 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
265d0 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
265e0 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
265f0 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
26600 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
26610 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
26620 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
26630 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
26640 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
26650 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
26660 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
26670 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
26680 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
26690 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
266a0 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
266b0 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
266c0 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
266d0 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
266e0 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
266f0 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
26700 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
26710 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
26720 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
26730 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
26740 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
26750 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
26760 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
26770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26780 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
26790 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
267a0 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
267b0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
267c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
267d0 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
267e0 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
267f0 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
26800 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
26810 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
26820 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
26830 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
26840 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26850 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
26860 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26870 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 66  ntKey ){.      f
26880 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
26890 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
268a0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
268b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
268c0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
268d0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
268e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
268f0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
26900 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
26910 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
26920 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26930 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
26940 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
26950 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26960 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
26970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26980 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
26990 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
269a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
269b0 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
269c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
269d0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
269e0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
269f0 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
26a00 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
26a10 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
26a20 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26a30 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
26a40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
26a50 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
26a60 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
26a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a80 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26a90 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
26aa0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26ab0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
26ac0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
26ad0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
26ae0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
26af0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26b00 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
26b10 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
26b20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
26b30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
26b40 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
26b50 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26b60 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
26b70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26b80 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
26b90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26bc0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
26bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
26bf0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
26c00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
26c10 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
26c20 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
26c30 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
26c40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
26c50 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
26c60 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a       int nCell;.
26c70 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
26c80 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26c90 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
26ca0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20  ildPtrSize;..   
26cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
26cc0 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
26cd0 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
26ce0 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
26cf0 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
26d00 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
26d10 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
26d20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
26d30 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
26d40 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
26d50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
26d60 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
26d70 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
26d80 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
26d90 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
26da0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
26db0 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
26dc0 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
26dd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
26de0 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
26df0 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
26e00 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
26e10 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
26e20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
26e30 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
26e40 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
26e50 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
26e60 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
26e70 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
26e80 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
26e90 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
26ea0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
26eb0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
26ec0 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
26ed0 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
26ee0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
26ef0 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
26f00 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
26f10 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
26f20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
26f30 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
26f40 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
26f50 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
26f60 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
26f70 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
26f80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26f90 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
26fa0 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
26fb0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
26fc0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26fd0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26fe0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
26ff0 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
27000 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
27010 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
27020 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
27030 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
27040 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
27050 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
27060 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
27070 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
27080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
27090 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
270a0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
270b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
270c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
270d0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
270e0 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
270f0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
27100 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
27110 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
27120 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
27130 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
27140 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
27150 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
27160 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
27170 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
27180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27190 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
271a0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
271b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
271c0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
271d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
271e0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
271f0 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
27200 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
27210 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
27220 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
27230 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
27240 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
27250 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
27260 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
27270 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
27280 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
27290 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
272a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
272b0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
272c0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
272d0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
272e0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
272f0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
27300 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
27310 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
27320 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
27330 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
27340 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
27350 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
27360 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
27370 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
27380 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
27390 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
273a0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
273b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
273c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
273d0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
273e0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
273f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
27400 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27410 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
27420 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
27430 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
27440 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
27450 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
27460 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
27470 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
27480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
27490 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
274a0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
274b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
274c0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
274d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
274e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
274f0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
27500 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
27510 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
27520 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
27530 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
27540 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
27550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
27560 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
27570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
27580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
27590 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
275a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
275b0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
275c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
275d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
275e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
275f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
27600 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27610 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
27620 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27630 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
27640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27650 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
27660 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
27670 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
27680 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
27690 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
276a0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
276b0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
276c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
276d0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
276e0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
276f0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27700 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27710 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
27720 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
27730 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
27740 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27750 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27760 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27770 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27780 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
27790 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
277a0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
277b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
277c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
277d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
277e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
277f0 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
27800 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
27810 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
27820 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
27830 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
27840 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27850 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27870 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
27880 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
27890 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
278a0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
278b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
278c0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
278d0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
278e0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
278f0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
27900 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
27910 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
27920 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27930 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
27940 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
27950 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
27960 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
27970 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
27980 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
27990 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
279a0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
279b0 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
279c0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
279d0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
279e0 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
279f0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
27a00 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
27a10 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
27a20 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
27a30 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
27a40 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
27a50 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
27a60 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
27a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
27a80 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
27a90 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
27aa0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
27ab0 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
27ac0 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
27ad0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
27ae0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
27af0 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
27b00 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
27b10 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
27b20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
27b30 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
27b40 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
27b50 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
27b60 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
27b70 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
27b80 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
27b90 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
27ba0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
27bb0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
27bc0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
27bd0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
27be0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
27bf0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
27c00 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
27c10 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
27c20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27c30 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
27c40 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
27c50 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
27c60 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
27c70 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
27c80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
27c90 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
27ca0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
27cb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
27cc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27cd0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27ce0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27cf0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
27d00 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
27d10 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
27d20 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
27d30 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
27d40 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
27d50 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
27d60 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
27d70 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
27d80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27da0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
27db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27dc0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
27dd0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
27de0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
27df0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
27e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
27e20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
27e30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27e40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27e50 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
27e60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27e70 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
27e80 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
27e90 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
27ea0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
27eb0 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
27ec0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
27ed0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
27ee0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
27ef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
27f00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
27f10 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
27f20 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
27f30 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
27f40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27f50 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
27f60 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
27f70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
27f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27f90 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
27fa0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
27fb0 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
27fc0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
27fd0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
27fe0 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
27ff0 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
28000 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
28010 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
28020 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
28030 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
28040 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
28050 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
28060 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
28070 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
28080 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
28090 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
280a0 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
280b0 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
280c0 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
280d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
280e0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
280f0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
28100 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
28110 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
28120 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28130 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
28140 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
28150 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
28160 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
28170 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
28180 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28190 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
281a0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
281b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
281c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
281d0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
281e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
281f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28200 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
28210 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
28220 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28230 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
28250 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
28260 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
28270 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
28280 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
28290 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
282a0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
282b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
282c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
282d0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
282e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
282f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28300 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
28310 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
28320 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
28330 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
28340 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
28350 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
28360 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
28370 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
28380 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
28390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
283a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
283b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
283c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
283d0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
283e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
283f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28400 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
28410 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
28420 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
28430 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
28440 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
28450 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
28460 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
28470 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
28480 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
28490 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
284a0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
284b0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
284c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
284d0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
284e0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
284f0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
28500 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
28510 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
28520 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28530 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
28540 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28550 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28560 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
28570 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
28580 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28590 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
285a0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
285b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
285c0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
285d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
285e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
285f0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
28600 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28610 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
28620 44 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57  D ){.    if( ALW
28630 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
28640 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
28650 53 45 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  SEEK) ){.      r
28660 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
28670 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
28680 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
28690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
286a0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
286b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
286c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
286d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
286e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
286f0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
28700 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
28710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28720 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28730 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
28740 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
28750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
28770 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
28780 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
28790 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
287a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
287b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
287c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
287d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
287e0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
287f0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
28800 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28820 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
28830 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
28840 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
28850 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28860 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28880 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
28890 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
288a0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
288b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
288c0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
288d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
288e0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
288f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
28900 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
28910 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28920 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
28930 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28940 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
28950 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
28960 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
28970 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28980 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
28990 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
289a0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
289b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
289c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
289d0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
289e0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
289f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28a00 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
28a10 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
28a20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
28a30 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
28a40 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
28a50 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
28a60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28a70 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
28a80 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28a90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28aa0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
28ab0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
28ac0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
28ad0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
28ae0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
28af0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
28b00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28b10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
28b20 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
28b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28b40 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
28b50 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
28b60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28b70 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
28b80 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
28b90 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
28ba0 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
28bb0 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
28bc0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
28bd0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
28be0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
28bf0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
28c00 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
28c10 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
28c20 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
28c30 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
28c40 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
28c50 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
28c60 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
28c70 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
28c80 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
28c90 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
28ca0 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
28cb0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
28cc0 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
28cd0 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
28ce0 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
28cf0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
28d00 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
28d10 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
28d20 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
28d30 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
28d40 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
28d50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
28d60 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
28d70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
28d80 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
28d90 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
28da0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
28db0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
28dc0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
28dd0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
28de0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
28df0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
28e00 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
28e10 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
28e20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28e30 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
28e40 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
28e50 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
28e60 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
28e70 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
28e80 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
28e90 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
28ea0 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
28eb0 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
28ec0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
28ed0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
28ee0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
28ef0 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
28f00 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
28f10 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
28f20 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
28f30 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
28f40 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
28f50 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
28f60 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
28f70 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
28f80 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
28f90 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
28fa0 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
28fb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
28fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
28fd0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
28fe0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
28ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29000 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
29010 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
29020 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
29030 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
29040 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
29050 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
29060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
29070 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
29080 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
29090 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
290a0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
290b0 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
290c0 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
290d0 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
290e0 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
290f0 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
29100 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
29110 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
29120 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
29130 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
29140 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
29150 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
29160 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
29170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29180 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
29190 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
291a0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
291b0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
291c0 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
291d0 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
291e0 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
291f0 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
29200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29210 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
29220 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29230 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29240 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
29250 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
29260 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
29270 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
29280 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
29290 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
292a0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
292b0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
292c0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
292d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
292e0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
292f0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
29300 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
29310 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
29320 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29330 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
29340 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
29350 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
29360 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
29370 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
29380 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
29390 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
293a0 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
293b0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
293c0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
293d0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
293e0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
293f0 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
29400 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
29410 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
29420 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
29430 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
29440 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
29450 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
29460 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
29470 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
29480 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
29490 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
294a0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
294b0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
294c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
294d0 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
294e0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
294f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
29500 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
29510 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
29520 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29530 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
29540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
29550 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
29560 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29570 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
29580 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
29590 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
295a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
295b0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
295c0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
295d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
295e0 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
295f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29600 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
29610 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
29620 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
29630 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
29640 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
29650 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
29660 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
29670 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
29680 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
29690 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
296a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
296b0 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
296c0 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
296d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
296e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
296f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
29700 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
29720 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
29730 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
29740 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
29750 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
29760 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
29770 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
29780 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
29790 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
297a0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
297b0 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
297c0 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
297d0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
297e0 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
297f0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
29800 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
29810 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
29820 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
29830 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
29840 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
29850 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
29860 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
29870 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
29880 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
29890 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
298a0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
298b0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
298c0 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
298d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
298e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
298f0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
29900 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29910 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
29920 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
29930 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
29940 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
29950 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
29960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29970 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29980 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
29990 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
299a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
299b0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
299c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
299d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
299e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
299f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29a00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
29a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
29a20 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
29a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29a40 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
29a50 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20  0 );..      k = 
29a60 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
29a70 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20  ->aData[4]); /* 
29a80 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  # of leaves on t
29a90 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
29aa0 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  /.      if( k==0
29ab0 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
29ac0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
29ad0 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
29ae0 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
29af0 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
29b00 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
29b10 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
29b20 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
29b30 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
29b40 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
29b50 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
29b60 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
29b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
29b80 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
29b90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29ba0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
29bb0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
29bc0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29bd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
29be0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29bf0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
29c00 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
29c10 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
29c20 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
29c30 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
29c40 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
29c50 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
29c60 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
29c70 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
29c80 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
29c90 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
29ca0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
29cb0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
29cc0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
29cd0 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
29ce0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
29cf0 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
29d00 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
29d10 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
29d20 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
29d30 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
29d40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
29d50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29d60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
29d70 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
29d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
29d90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
29da0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
29db0 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
29dc0 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
29dd0 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
29de0 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
29df0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
29e00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29e10 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
29e20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
29e30 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
29e40 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
29e50 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
29e60 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
29e70 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
29e80 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
29e90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
29ea0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
29eb0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
29ec0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
29ed0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
29ee0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
29ef0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29f00 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
29f10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29f20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
29f30 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29f40 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
29f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
29f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
29f70 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
29f80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
29f90 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
29fa0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
29fb0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
29fc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
29fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29fe0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29ff0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2a000 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a010 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a030 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a040 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a060 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2a070 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
2a080 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2a090 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2a0a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a0c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2a0d0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
2a0e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2a0f0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
2a100 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
2a110 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
2a120 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
2a130 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
2a140 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
2a150 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
2a160 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
2a170 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2a180 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2a190 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
2a1a0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
2a1b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2a1c0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
2a1d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
2a1e0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
2a1f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
2a200 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2a210 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2a220 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a230 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a250 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
2a260 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
2a270 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a280 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2a290 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2a2a0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2a2b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a2c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a2d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a2e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a2f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a310 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2a320 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2a330 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a350 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2a360 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2a370 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2a380 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a390 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a3a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2a3b0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2a3c0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2a3d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2a3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2a3f0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2a400 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2a410 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2a420 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2a430 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2a440 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2a450 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2a460 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2a470 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2a480 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2a490 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2a4a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a4b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a4c0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2a4d0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2a4e0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a4f0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2a500 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2a510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a520 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a530 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a540 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2a550 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2a560 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2a570 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a580 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a5a0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2a5b0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2a5c0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2a5d0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2a5e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2a5f0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2a600 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2a610 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2a620 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2a630 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2a640 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2a650 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2a660 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2a670 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2a680 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2a690 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2a6a0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2a6b0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2a6c0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2a6d0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2a6e0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2a6f0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2a700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2a710 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2a720 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2a730 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2a740 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2a750 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2a760 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2a780 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a790 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2a7b0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2a7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a7d0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2a7f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2a800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a810 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2a820 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a830 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2a840 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2a850 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2a860 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2a870 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2a880 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2a890 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2a8a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2a8b0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2a8c0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2a8d0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2a8e0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2a8f0 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2a900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a910 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a930 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2a940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a960 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2a970 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2a980 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2a990 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2a9a0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2a9b0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2a9c0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2a9d0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2a9e0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2a9f0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2aa00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2aa10 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2aa20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2aa30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2aa40 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2aa50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2aa60 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2aa70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2aa80 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2aa90 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2aaa0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2aab0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2aac0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2aad0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2aae0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2aaf0 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2ab00 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2ab10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2ab20 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2ab30 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2ab40 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab60 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2ab70 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2ab90 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2aba0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2abb0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2abc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2abd0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2abe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2abf0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2ac00 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2ac10 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2ac20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2ac30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2ac40 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2ac50 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2ac60 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2ac70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ac80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2ac90 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2aca0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2acb0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2acc0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2acd0 67 6e 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54  gno) ? PAGER_GET
2ace0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
2acf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2ad00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ad10 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2ad20 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
2ad30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ad40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ad60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2ad70 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2ad80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2ad90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ada0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2adb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2adc0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
2add0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ade0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
2adf0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2ae00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2ae10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ae20 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2ae30 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2ae40 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
2ae50 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
2ae60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2ae70 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
2ae80 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2ae90 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
2aea0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
2aeb0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2aec0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
2aed0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
2aee0 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
2aef0 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
2af00 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
2af10 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2af20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
2af30 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
2af40 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
2af50 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
2af60 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
2af70 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
2af80 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
2af90 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
2afa0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
2afb0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
2afc0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2afd0 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
2afe0 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
2aff0 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
2b000 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
2b010 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
2b020 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
2b030 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
2b040 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
2b050 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
2b060 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
2b070 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
2b080 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
2b090 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
2b0a0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
2b0b0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
2b0c0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
2b0d0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
2b0e0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
2b0f0 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
2b100 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
2b110 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2b120 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
2b130 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
2b140 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
2b150 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
2b160 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
2b170 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
2b180 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
2b190 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2b1a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
2b1b0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
2b1c0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
2b1d0 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
2b1e0 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
2b1f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
2b200 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
2b210 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
2b220 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
2b230 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
2b240 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2b250 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
2b260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b270 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2b280 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
2b290 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
2b2a0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
2b2b0 29 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  )) ? PAGER_GET_N
2b2c0 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20  OCONTENT : 0;.. 
2b2d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b2e0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
2b2f0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2b300 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
2b320 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
2b330 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2b340 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b350 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
2b360 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
2b370 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b380 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2b390 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2b3a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2b3b0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
2b3c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
2b3d0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
2b3e0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
2b3f0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
2b400 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
2b410 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
2b420 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
2b430 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
2b440 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
2b450 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
2b460 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
2b470 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
2b480 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
2b490 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
2b4a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
2b4b0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
2b4c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2b4d0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2b4e0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
2b4f0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
2b500 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
2b510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b520 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
2b530 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b540 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
2b550 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b560 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
2b570 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  Pg, bNoContent);
2b580 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b5a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b5b0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
2b5c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b5d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2b5e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2b5f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b600 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
2b610 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
2b620 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2b630 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2b640 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
2b650 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
2b660 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
2b670 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
2b680 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
2b690 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
2b6a0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
2b6b0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
2b6c0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2b6d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b6e0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
2b6f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b700 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
2b710 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2b720 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2b730 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2b740 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b750 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2b760 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2b770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b780 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b790 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2b7a0 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
2b7b0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
2b7c0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
2b7d0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
2b7e0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2b7f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2b800 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
2b810 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
2b820 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
2b830 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
2b840 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2b850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2b870 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2b880 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
2b890 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
2b8a0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2b8b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2b8c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b8d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b8e0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
2b8f0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
2b900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2b910 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
2b920 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2b930 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
2b940 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b950 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2b960 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
2b970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2b980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b990 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
2b9a0 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
2b9b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
2b9c0 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
2b9d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2b9e0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2b9f0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
2ba00 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
2ba10 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
2ba20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2ba30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2ba40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ba50 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
2ba60 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
2ba70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
2ba80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
2ba90 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
2baa0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2bab0 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
2bac0 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
2bad0 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
2bae0 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
2baf0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
2bb00 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2bb10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2bb20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
2bb30 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2bb40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
2bb50 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
2bb60 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
2bb70 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
2bb80 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2bb90 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
2bba0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2bbb0 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
2bbc0 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
2bbd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2bbe0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2bbf0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
2bc00 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2bc10 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2bc20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2bc30 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2bc40 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2bc50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2bc60 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2bc70 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2bc80 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2bc90 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2bca0 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2bcb0 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bcd0 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2bce0 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2bcf0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bd20 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2bd30 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd50 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2bd60 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2bd70 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2bd80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2bd90 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2bda0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2bdb0 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
2bdc0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
2bdd0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
2bde0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
2bdf0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
2be00 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
2be10 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
2be20 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
2be30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
2be40 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
2be50 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2be60 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2be70 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
2be80 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
2be90 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
2bea0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2beb0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2bec0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2bed0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2bee0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
2bef0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
2bf00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2bf10 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
2bf20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2bf30 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
2bf40 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
2bf50 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2bf60 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
2bf70 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
2bf80 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
2bf90 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
2bfa0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
2bfb0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
2bfc0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
2bfd0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2bfe0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
2bff0 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
2c000 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2c010 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2c020 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
2c030 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
2c040 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c050 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c060 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
2c070 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2c080 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2c090 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
2c0a0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
2c0b0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
2c0c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2c0d0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2c0e0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2c0f0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
2c100 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
2c110 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
2c120 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
2c130 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
2c140 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2c150 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
2c160 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
2c170 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
2c180 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
2c190 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2c1a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
2c1b0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
2c1c0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
2c1d0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
2c1e0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
2c1f0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
2c200 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
2c210 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2c220 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
2c230 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
2c240 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
2c250 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2c260 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
2c270 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
2c280 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
2c290 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
2c2a0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
2c2b0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
2c2c0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
2c2d0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2c2e0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
2c2f0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
2c300 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2c310 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
2c320 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2c330 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
2c340 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
2c350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
2c360 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
2c370 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
2c380 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2c390 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
2c3a0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
2c3b0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
2c3c0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2c3d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2c3e0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
2c3f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2c400 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2c410 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2c420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c430 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2c440 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2c450 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2c460 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2c470 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2c480 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2c490 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2c4a0 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2c4b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2c4c0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2c4d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c4e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2c4f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c500 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2c510 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2c520 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2c530 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2c540 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2c550 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2c560 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2c570 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2c580 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2c590 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2c5a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2c5b0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2c5c0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2c5d0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2c5e0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2c5f0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2c600 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2c610 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2c620 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2c630 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2c640 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2c650 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2c660 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2c670 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2c680 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2c690 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2c6a0 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2c6b0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2c6c0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2c6d0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2c6e0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2c6f0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2c700 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2c710 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2c720 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2c730 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2c740 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2c750 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2c760 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2c770 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2c780 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2c790 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2c7a0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2c7b0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2c7c0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2c7d0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2c7e0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2c7f0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2c800 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2c810 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2c820 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2c830 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2c840 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2c850 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2c860 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2c870 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2c880 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2c890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c8a0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2c8b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2c8c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c8e0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2c8f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2c900 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2c910 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2c920 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2c930 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2c940 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2c950 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2c960 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2c970 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2c980 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2c990 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2c9a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c9b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2c9c0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2c9d0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2c9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c9f0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2ca00 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2ca10 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2ca20 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2ca30 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2ca40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2ca50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2ca60 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2ca70 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2ca80 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2ca90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2caa0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2cab0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2cac0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2cad0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2cae0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2caf0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2cb00 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2cb10 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2cb20 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2cb30 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2cb40 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2cb50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2cb60 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2cb70 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2cb80 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2cb90 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2cba0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2cbb0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2cbc0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2cbd0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2cbe0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2cbf0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2cc00 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2cc10 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
2cc20 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2cc30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2cc40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2cc50 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2cc60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cc70 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2cc80 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
2cc90 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
2cca0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
2ccb0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2ccc0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
2ccd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2cce0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
2ccf0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
2cd00 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
2cd10 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
2cd20 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
2cd30 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
2cd40 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
2cd50 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
2cd60 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
2cd70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2cd80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2cd90 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
2cda0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
2cdb0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2cdc0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
2cdd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2cde0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2cdf0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2ce00 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
2ce10 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
2ce20 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
2ce30 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
2ce40 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
2ce50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2ce60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2ce70 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
2ce80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2ce90 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
2cea0 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
2ceb0 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
2cec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2ced0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
2cee0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2cef0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
2cf00 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
2cf10 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
2cf20 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
2cf30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2cf40 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2cf50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2cf60 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2cf70 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2cf80 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
2cf90 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
2cfa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2cfb0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
2cfc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2cfd0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
2cfe0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
2cff0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
2d000 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
2d010 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
2d020 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
2d030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d040 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d050 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
2d060 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
2d070 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
2d080 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
2d090 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2d0a0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
2d0b0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2d0c0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
2d0d0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
2d0e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2d0f0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
2d100 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
2d110 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
2d120 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
2d130 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
2d140 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
2d150 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
2d160 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
2d170 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
2d180 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
2d190 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2d1a0 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
2d1b0 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
2d1c0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2d1d0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
2d1e0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
2d1f0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2d200 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
2d210 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
2d220 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
2d230 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
2d240 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
2d250 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
2d260 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
2d270 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2d280 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2d290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d2a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d2b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
2d2c0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2d2d0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2d2e0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
2d2f0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
2d300 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d310 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d320 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
2d330 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
2d340 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2d350 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
2d360 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
2d370 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2d380 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
2d390 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
2d3a0 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2d3b0 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
2d3c0 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
2d3d0 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
2d3e0 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
2d3f0 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
2d400 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
2d410 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
2d420 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
2d430 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
2d440 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
2d450 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
2d460 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2d470 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
2d480 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
2d490 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
2d4a0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2d4b0 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
2d4c0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2d4d0 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
2d4e0 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
2d4f0 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
2d500 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
2d510 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
2d520 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
2d530 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
2d540 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
2d550 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2d560 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
2d570 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
2d580 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
2d590 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
2d5a0 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
2d5b0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
2d5c0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
2d5d0 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
2d5e0 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
2d5f0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
2d600 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
2d610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d620 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d630 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
2d640 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2d650 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
2d660 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
2d670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2d680 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
2d690 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2d6a0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2d6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d6c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d6d0 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
2d6e0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
2d6f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d700 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
2d710 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
2d720 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
2d730 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
2d740 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
2d750 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
2d760 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
2d770 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
2d780 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
2d790 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
2d7a0 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
2d7b0 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
2d7c0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
2d7d0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2d7e0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
2d7f0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
2d800 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
2d810 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
2d820 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2d830 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
2d840 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
2d850 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
2d860 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
2d870 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
2d880 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
2d890 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
2d8a0 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
2d8b0 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
2d8c0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
2d8d0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
2d8e0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
2d8f0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
2d900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2d910 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
2d920 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
2d930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d940 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
2d950 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
2d960 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2d970 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
2d980 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
2d990 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
2d9a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2d9b0 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2d9c0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
2d9d0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2d9e0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
2d9f0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
2da00 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
2da30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2da40 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
2da50 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da70 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
2da80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2da90 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
2daa0 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
2dab0 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
2dac0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
2dad0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
2dae0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
2daf0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
2db00 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
2db10 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
2db20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
2db30 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
2db40 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2db50 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
2db60 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
2db70 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
2db80 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
2db90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2dba0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2dbb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
2dbc0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
2dbd0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
2dbe0 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
2dbf0 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
2dc00 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
2dc10 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
2dc20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
2dc30 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
2dc40 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
2dc50 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
2dc60 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
2dc70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2dc80 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2dc90 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2dca0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2dcb0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dcc0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2dcd0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
2dce0 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
2dcf0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2dd00 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
2dd10 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
2dd20 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
2dd30 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
2dd40 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
2dd50 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
2dd60 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
2dd70 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
2dd80 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
2dd90 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
2dda0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2ddb0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
2ddc0 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50  &nKey);.  btreeP
2ddd0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2dde0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2ddf0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2de00 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
2de10 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
2de20 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
2de30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2de40 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44  .nData==(u32)(nD
2de50 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20  ata+nZero) );.  
2de60 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2de70 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
2de80 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
2de90 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
2dea0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2deb0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
2dec0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
2ded0 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
2dee0 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
2def0 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e   if( NEVER(nKey>
2df00 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
2df10 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ey==0) ){.      
2df20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2df30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2df40 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
2df50 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2df60 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2df70 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2df80 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
2df90 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
2dfa0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
2dfb0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
2dfc0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
2dfd0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
2dfe0 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
2dff0 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
2e000 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
2e010 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
2e020 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
2e030 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e040 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2e050 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
2e060 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
2e070 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
2e080 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
2e090 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
2e0a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2e0b0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
2e0c0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
2e0d0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
2e0e0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
2e0f0 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
2e100 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
2e110 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
2e120 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2e130 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
2e140 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2e150 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
2e160 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2e170 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
2e180 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
2e190 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e1a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2e1b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2e1c0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2e1d0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2e1e0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
2e1f0 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
2e200 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2e210 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
2e220 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
2e230 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
2e240 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
2e250 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
2e260 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
2e270 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
2e280 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
2e290 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
2e2a0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
2e2b0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
2e2c0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
2e2d0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
2e2e0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
2e2f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
2e300 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2e310 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
2e320 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
2e330 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
2e340 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
2e350 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
2e360 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
2e370 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
2e380 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
2e390 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
2e3a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2e3b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2e3c0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2e3d0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
2e3e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e3f0 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
2e400 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
2e410 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
2e420 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
2e430 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2e440 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
2e450 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
2e460 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
2e470 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2e480 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
2e490 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
2e4a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2e4b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2e4c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e4d0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
2e4e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e4f0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
2e500 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2e510 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2e520 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
2e530 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2e540 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
2e550 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2e560 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2e570 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2e580 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
2e590 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2e5a0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2e5b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e5c0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2e5d0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2e5e0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
2e5f0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2e600 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2e610 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2e620 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
2e630 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2e640 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2e650 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
2e660 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
2e670 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2e680 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2e690 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2e6a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e6b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2e6c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
2e6d0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2e6e0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
2e6f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2e700 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2e710 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
2e720 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
2e730 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
2e740 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2e750 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
2e760 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
2e770 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
2e780 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
2e790 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2e7a0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
2e7b0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
2e7c0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
2e7d0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
2e7e0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
2e7f0 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
2e800 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
2e810 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
2e820 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2e830 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
2e840 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
2e850 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
2e860 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
2e870 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
2e880 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
2e890 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e8a0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
2e8b0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2e8c0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
2e8d0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2e8e0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
2e8f0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
2e900 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
2e910 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2e920 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
2e930 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
2e940 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
2e950 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
2e960 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2e970 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2e980 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2e990 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2e9a0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2e9b0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
2e9c0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
2e9d0 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
2e9e0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
2e9f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
2ea00 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
2ea10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ea20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
2ea30 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
2ea40 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
2ea50 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
2ea60 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
2ea70 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
2ea80 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
2ea90 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
2eaa0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
2eab0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2eac0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
2ead0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
2eae0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2eaf0 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
2eb00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2eb10 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2eb20 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
2eb30 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
2eb40 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
2eb50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
2eb60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
2eb70 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
2eb80 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
2eb90 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
2eba0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
2ebb0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
2ebc0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
2ebd0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2ebe0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
2ebf0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
2ec00 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
2ec10 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
2ec20 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
2ec30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2ec40 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
2ec50 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
2ec60 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
2ec70 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
2ec80 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
2ec90 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
2eca0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
2ecb0 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
2ecc0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
2ecd0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2ece0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
2ecf0 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
2ed00 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
2ed10 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
2ed20 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
2ed30 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65  ata[] */.  u8 *e
2ed40 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e  ndPtr;     /* En
2ed50 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  d of loop */.  i
2ed60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
2ed70 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2ed80 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2ed90 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
2eda0 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
2edb0 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
2edc0 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
2edd0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2ede0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2edf0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
2ee00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2ee10 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2ee20 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
2ee30 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ee40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ee50 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2ee60 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2ee70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ee80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ee90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2eea0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2eeb0 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50  ata;.  ptr = &pP
2eec0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
2eed0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
2eee0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
2eef0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2ef00 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
2ef10 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
2ef20 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
2ef30 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
2ef40 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
2ef50 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
2ef60 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74  f( pc < (u32)get
2ef70 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2ef80 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70  5]) || pc+sz > p
2ef90 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2efa0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
2efb0 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
2efc0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
2efd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
2efe0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
2eff0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
2f000 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
2f010 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2f020 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20  .  }.  endPtr = 
2f030 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
2f040 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  [2*pPage->nCell 
2f050 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  - 2];.  assert( 
2f060 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
2f070 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b  NT(ptr)&1)==0 );
2f080 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61    /* ptr is alwa
2f090 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65  ys 2-byte aligne
2f0a0 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74  d */.  while( pt
2f0b0 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20  r<endPtr ){.    
2f0c0 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75  *(u16*)ptr = *(u
2f0d0 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20  16*)&ptr[2];.   
2f0e0 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20   ptr += 2;.  }. 
2f0f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
2f100 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2f110 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
2f120 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
2f130 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
2f140 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2f150 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
2f160 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
2f170 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
2f180 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
2f190 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
2f1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2f1b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
2f1c0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2f1d0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
2f1e0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
2f1f0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
2f200 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
2f210 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2f220 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
2f230 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
2f240 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
2f250 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
2f260 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
2f270 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
2f280 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2f290 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2f2a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2f2b0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2f2c0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2f2d0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2f2e0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2f2f0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2f300 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2f310 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2f320 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2f330 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2f340 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2f350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2f360 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f370 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2f380 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2f390 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2f3a0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2f3b0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2f3c0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2f3d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2f3e0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2f3f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2f400 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2f410 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2f420 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2f430 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2f440 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2f450 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2f460 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2f470 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2f480 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2f490 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2f4a0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2f4b0 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2f4c0 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2f4d0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2f4e0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2f4f0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2f500 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2f510 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2f520 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2f530 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2f540 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2f550 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2f560 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2f570 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2f580 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2f590 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2f5a0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2f5b0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2f5c0 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2f5d0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2f5e0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2f5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2f600 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2f610 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2f620 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2f630 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2f640 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2f650 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2f660 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2f670 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2f680 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2f690 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2f6a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2f6b0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2f6c0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2f6d0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2f6e0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2f6f0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2f700 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2f710 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2f720 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2f730 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2f740 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2f750 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2f760 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2f770 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2f780 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2f790 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2f7a0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2f7b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2f7c0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2f7d0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2f7e0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2f7f0 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f  *endPtr;       /
2f800 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2f810 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69  p */..  int nSki
2f820 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2f830 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2f840 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2f850 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2f860 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2f870 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2f880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f890 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2f8a0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2f8b0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2f8c0 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2f8d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2f8e0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2f8f0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
2f900 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2f910 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
2f920 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
2f930 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
2f940 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2f950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f960 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2f970 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
2f980 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
2f990 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
2f9a0 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
2f9b0 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
2f9c0 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
2f9d0 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
2f9e0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
2f9f0 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
2fa00 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
2fa10 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
2fa20 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
2fa30 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
2fa40 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
2fa50 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
2fa60 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
2fa70 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
2fa80 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
2fa90 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
2faa0 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
2fab0 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
2fac0 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
2fad0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
2fae0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
2faf0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
2fb00 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
2fb10 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
2fb20 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2fb30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
2fb40 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
2fb50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
2fb60 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
2fb70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
2fb80 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2fb90 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
2fba0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2fbb0 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
2fbc0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2fbd0 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
2fbe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
2fbf0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2fc00 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
2fc10 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
2fc20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
2fc30 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
2fc40 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
2fc50 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
2fc60 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2fc70 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
2fc80 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2fc90 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2fca0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fcb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2fcc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fcd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fce0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2fcf0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2fd00 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2fd10 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2fd20 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2fd30 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2fd40 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2fd50 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2fd60 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2fd70 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2fd80 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2fd90 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2fda0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2fdb0 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2fdc0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2fdd0 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2fde0 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2fdf0 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2fe00 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2fe10 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2fe20 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2fe30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2fe40 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2fe50 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2fe60 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2fe70 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2fe80 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2fe90 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2fea0 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
2feb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2fec0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2fed0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2fee0 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2fef0 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2ff00 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2ff10 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2ff20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2ff30 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2ff40 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2ff50 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2ff60 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d  .    }.    ptr =
2ff70 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20   &data[end];.   
2ff80 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b   endPtr = &data[
2ff90 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ins];.    assert
2ffa0 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  ( (SQLITE_PTR_TO
2ffb0 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20  _INT(ptr)&1)==0 
2ffc0 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c  );  /* ptr is al
2ffd0 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67  ways 2-byte alig
2ffe0 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ned */.    while
2fff0 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a  ( ptr>endPtr ){.
30000 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72        *(u16*)ptr
30010 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d   = *(u16*)&ptr[-
30020 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d  2];.      ptr -=
30030 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75   2;.    }.    pu
30040 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
30050 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
30060 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
30070 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
30080 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
30090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
300a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
300b0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
300c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
300d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
300e0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
300f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
30100 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
30110 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
30120 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
30130 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
30140 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
30150 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
30160 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
30170 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
30180 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
30190 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
301a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
301b0 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
301c0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
301d0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
301e0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
301f0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
30200 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
30210 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
30220 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
30230 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
30240 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
30250 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
30260 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
30270 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
30280 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
30290 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
302a0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
302b0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
302c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
302d0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
302e0 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
302f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
30300 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
30310 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
30320 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
30330 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
30340 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
30350 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
30360 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
30370 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
30380 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
30390 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
303a0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
303b0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
303c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
303d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
303e0 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
303f0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
30400 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
30410 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
30420 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
30430 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
30440 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
30450 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
30460 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
30470 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
30480 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
30490 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
304a0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
304b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
304c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
304d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
304e0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
304f0 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
30500 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
30510 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
30520 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
30530 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
30540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30550 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30560 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30570 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
30580 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
30590 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
305a0 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
305b0 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
305c0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
305d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
305e0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
305f0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
30600 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
30610 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  lptr = &pPage->a
30620 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
30630 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
30640 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
30650 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
30660 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
30670 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
30680 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
30690 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
306a0 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
306b0 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
306c0 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
306d0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
306e0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
306f0 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
30700 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
30710 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
30720 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
30730 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
30740 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
30750 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
30760 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
30770 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
30780 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
30790 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
307a0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
307b0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
307c0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
307d0 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
307e0 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
307f0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
30800 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
30810 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
30820 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
30830 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
30840 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
30850 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
30860 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
30870 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
30880 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
30890 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
308a0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
308b0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
308c0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
308d0 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
308e0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
308f0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
30900 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
30910 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
30920 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
30930 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
30940 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
30950 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
30960 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
30970 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
30980 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
30990 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
309a0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
309b0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
309c0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
309d0 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
309e0 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
309f0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
30a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30a10 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
30a20 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
30a30 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
30a40 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
30a50 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
30a60 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
30a70 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
30a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30a90 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
30aa0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
30ab0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
30ac0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
30ad0 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
30ae0 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
30af0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
30b00 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
30b10 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
30b20 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
30b30 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
30b40 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
30b50 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
30b60 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
30b70 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
30b80 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
30b90 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
30ba0 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
30bb0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
30bc0 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
30bd0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30be0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
30bf0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
30c00 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
30c10 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
30c20 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
30c30 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
30c40 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
30c50 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
30c60 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
30c70 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
30c80 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
30c90 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
30ca0 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
30cb0 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
30cc0 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
30cd0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
30ce0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
30cf0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
30d00 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
30d10 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
30d20 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
30d30 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
30d40 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
30d50 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
30d60 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
30d70 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
30d80 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
30d90 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
30da0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
30db0 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
30dc0 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
30dd0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
30de0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
30df0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
30e00 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
30e10 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
30e20 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
30e30 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
30e40 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
30e50 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
30e60 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
30e70 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
30e80 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
30e90 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
30ea0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
30eb0 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
30ec0 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
30ed0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
30ee0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
30ef0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
30f00 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
30f10 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
30f20 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
30f30 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
30f40 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
30f50 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
30f60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
30f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30f80 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
30f90 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
30fa0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30fd0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
30fe0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
30ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31000 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31010 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
31020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
31030 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
31040 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
31050 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31060 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31070 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
31080 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
31090 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
310a0 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
310b0 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
310c0 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
310d0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
310e0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
310f0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
31100 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  ->nCell==0 ) ret
31110 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31120 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
31130 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
31140 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
31150 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
31160 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
31170 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
31180 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31190 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
311a0 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
311b0 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
311c0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
311d0 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
311e0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
311f0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
31200 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
31210 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
31220 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
31230 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
31240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31250 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
31260 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
31270 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
31280 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  Page->apOvfl[0];
31290 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
312a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
312b0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
312c0 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
312d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
312e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
312f0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
31300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31310 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
31320 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
31330 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
31340 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
31350 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
31360 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
31370 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
31380 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
31390 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
313a0 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
313b0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
313c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
313d0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
313e0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
313f0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
31400 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
31410 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
31420 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
31430 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
31440 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
31450 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
31460 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
31470 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
31480 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
31490 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
314a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
314b0 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
314c0 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
314d0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
314e0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
314f0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
31500 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
31510 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31520 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
31530 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
31540 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
31550 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
31560 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
31570 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
31580 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
31590 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
315a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
315b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
315c0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
315d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
315e0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
315f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
31600 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
31610 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
31620 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
31630 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
31640 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
31650 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
31660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
31670 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
31680 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
31690 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
316a0 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
316b0 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
316c0 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
316d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
316e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
316f0 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
31700 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
31710 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
31720 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
31730 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
31740 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
31750 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
31760 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
31770 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
31780 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
31790 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
317a0 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
317b0 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
317c0 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
317d0 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
317e0 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
317f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
31800 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
31810 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
31820 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
31830 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
31840 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
31850 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
31860 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
31870 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
31880 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
31890 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
318a0 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
318b0 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
318c0 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
318d0 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
318e0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
318f0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
31900 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
31910 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
31920 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
31930 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
31940 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
31950 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
31960 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
31970 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
31980 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
31990 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
319a0 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
319b0 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
319c0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
319d0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
319e0 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
319f0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
31a00 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
31a10 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
31a20 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
31a30 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
31a40 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
31a50 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
31a60 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
31a70 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
31a80 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
31aa0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
31ab0 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
31ac0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
31ad0 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
31ae0 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
31af0 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
31b00 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
31b10 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
31b20 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
31b30 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
31b40 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
31b50 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
31b60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
31b70 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
31b80 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
31b90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
31ba0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
31bb0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
31bc0 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
31bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
31be0 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
31bf0 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
31c00 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
31c10 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
31c20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
31c30 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
31c40 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
31c50 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
31c60 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
31c70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31c80 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
31c90 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
31ca0 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
31cb0 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
31cc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
31cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
31ce0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
31cf0 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
31d00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
31d10 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
31d20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
31d30 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
31d40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31d50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
31d60 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
31d70 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
31d80 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
31d90 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
31da0 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
31db0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
31dc0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
31dd0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
31de0 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
31df0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
31e00 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
31e10 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
31e20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
31e30 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
31e40 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
31e50 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
31e60 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
31e70 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
31e80 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
31e90 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
31ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
31eb0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
31ec0 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
31ed0 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
31ee0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
31ef0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
31f00 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
31f10 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
31f20 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
31f30 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
31f40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31f50 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31f60 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
31f70 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
31f80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
31f90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
31fa0 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
31fb0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
31fc0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
31fd0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
31fe0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
31ff0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
32000 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
32010 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
32020 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
32030 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
32040 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32050 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
32060 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
32070 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
32080 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
32090 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
320a0 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
320b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
320c0 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
320d0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
320e0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
320f0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
32100 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
32110 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
32120 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
32130 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
32140 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
32150 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
32160 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
32170 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
32180 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
32190 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
321a0 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
321b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
321c0 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
321d0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
321e0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
321f0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
32200 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
32210 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70  he.** MemPage.ap
32220 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
32230 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
32240 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
32250 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
32260 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
32270 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
32280 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
32290 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
322a0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
322b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
322c0 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
322d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
322e0 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
322f0 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
32300 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
32310 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
32320 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
32330 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
32340 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
32350 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
32360 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
32370 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
32380 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
32390 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
323a0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
323b0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
323c0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
323d0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
323e0 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
323f0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
32400 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
32410 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
32420 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
32430 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
32440 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
32450 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
32460 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
32470 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
32480 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
32490 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
324a0 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
324b0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
324c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
324d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
324e0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
324f0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
32500 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
32510 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70  dr+5]) <= (int)p
32520 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
32530 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
32540 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
32550 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61   content from pa
32560 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
32570 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61   pTo. */.    iDa
32580 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ta = get2byte(&a
32590 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
325a0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
325b0 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
325c0 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
325d0 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
325e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
325f0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
32600 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
32610 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
32620 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
32630 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e  ;.  .    /* Rein
32640 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
32650 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
32660 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
32670 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
32680 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65      ** match the
32690 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
326a0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
326b0 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c   pTo can actuall
326c0 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20  y fail under.   
326d0 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75   ** fairly obscu
326e0 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
326f0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
32700 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e   is a copy of in
32710 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
32720 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20  * page pFrom..  
32730 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
32740 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Init = 0;.    rc
32750 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
32760 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  (pTo);.    if( r
32770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32780 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
32790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
327a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
327b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
327c0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
327d0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
327e0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
327f0 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79  s.    ** for any
32800 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66   b-tree or overf
32810 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70  low pages that p
32820 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  To now contains 
32830 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e  the pointers to.
32840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
32850 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
32860 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74        *pRC = set
32870 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
32880 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
32890 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
328a0 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
328b0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
328c0 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
328d0 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
328e0 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
328f0 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
32900 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
32910 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
32920 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
32930 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
32940 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
32950 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
32960 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
32970 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
32980 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
32990 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
329a0 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
329b0 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
329c0 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
329d0 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
329e0 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
329f0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
32a00 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
32a10 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
32a20 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
32a30 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
32a40 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
32a50 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
32a60 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
32a70 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
32a80 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
32a90 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
32aa0 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
32ab0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
32ac0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
32ad0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
32ae0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
32af0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
32b00 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
32b10 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
32b20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
32b30 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
32b40 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
32b50 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
32b60 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
32b70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32b80 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
32b90 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
32ba0 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
32bb0 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
32bc0 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
32bd0 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
32be0 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
32bf0 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
32c00 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
32c10 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
32c20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
32c30 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
32c40 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
32c50 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
32c60 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
32c70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
32c80 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
32c90 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
32ca0 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
32cb0 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
32cc0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
32cd0 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
32ce0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
32cf0 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
32d00 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
32d10 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
32d20 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
32d30 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
32d40 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
32d50 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
32d60 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
32d70 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
32d80 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
32d90 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
32da0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
32db0 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
32dc0 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
32dd0 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
32de0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
32df0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
32e00 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
32e10 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
32e20 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
32e30 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
32e40 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
32e50 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
32e60 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
32e70 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
32e80 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
32e90 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
32ea0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
32eb0 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
32ec0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
32ed0 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75   buffer big enou
32ee0 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70  gh to hold one p
32ef0 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e  age. If while in
32f00 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e  serting cells in
32f10 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  to the parent.**
32f20 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20   page (pParent) 
32f30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32f40 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
32f50 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
32f60 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
32f70 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f  e the parent's o
32f80 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42  verflow cells. B
32f90 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
32fa0 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20  tion inserts.** 
32fb0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75  a maximum of fou
32fc0 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  r divider cells 
32fd0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
32fe0 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61  page, and the ma
32ff0 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66  ximum.** size of
33000 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77   a cell stored w
33010 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61  ithin an interna
33020 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  l node is always
33030 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a   less than 1/4.*
33040 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  * of the page-si
33050 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61  ze, the aOvflSpa
33060 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67  ce[] buffer is g
33070 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
33080 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
33090 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  for all overflow
330a0 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   cells..**.** If
330b0 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73   aOvflSpace is s
330c0 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69  et to a null poi
330d0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
330e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
330f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
33100 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
33110 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
33120 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65  ER >= 1700 && de
33130 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70  fined(_M_ARM).#p
33140 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22  ragma optimize("
33150 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73  ", off).#endif.s
33160 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33170 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
33180 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
331a0 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
331b0 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
331c0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
331d0 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
331e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
331f0 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
33200 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
33210 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
33220 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33230 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
33240 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
33250 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
33260 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20  /.  int isRoot, 
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33280 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
33290 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
332a0 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62  -page */.  int b
332b0 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20  Bulk            
332c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
332d0 75 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ue if this call 
332e0 69 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c  is part of a bul
332f0 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42  k load */.){.  B
33300 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
33310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33320 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
33330 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
33340 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33360 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
33370 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
33380 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
33390 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
333a0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
333b0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
333c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
333d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
333e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
333f0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
33400 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
33410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33420 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33430 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
33440 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
33450 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
33460 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33470 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
33480 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
33490 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
334a0 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
334b0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
334c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
334d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
334e0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
334f0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
33500 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
33510 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
33520 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
33530 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
33540 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
33550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
33560 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
33570 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
33580 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
33590 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
335a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
335b0 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
335c0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
335d0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
335e0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
335f0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
33600 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
33610 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
33620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33630 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
33640 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
33650 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
33660 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
33670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33680 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
33690 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
336a0 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
336b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
336c0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
336d0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
336e0 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
336f0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
33700 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
33710 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
33720 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
33730 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
33740 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
33750 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
33760 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
33770 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
33780 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
33790 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
337a0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
337b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
337c0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
337d0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
337e0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
337f0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
33800 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
33810 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33820 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
33830 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
33840 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
33850 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
33860 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
33870 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
33880 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
33890 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
338a0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
338b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
338c0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
338d0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
338e0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
338f0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
33900 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
33910 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
33920 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
33930 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
33940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33950 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
33960 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
33970 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
33980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33990 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
339a0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
339b0 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
339c0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
339d0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
339e0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
339f0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
33a00 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33a20 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
33a30 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
33a40 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
33a50 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
33a60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33a70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
33a80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
33a90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
33aa0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33ab0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
33ac0 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
33ad0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
33ae0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
33af0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
33b00 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
33b10 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
33b20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
33b30 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
33b40 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
33b50 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
33b60 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
33b70 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
33b80 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
33b90 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
33ba0 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
33bb0 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
33bc0 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
33bd0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
33be0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
33bf0 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
33c00 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
33c10 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
33c20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
33c30 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33c40 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
33c50 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
33c60 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
33c70 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
33c80 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  || pParent->aiOv
33c90 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64  fl[0]==iParentId
33ca0 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
33cb0 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
33cc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33cd0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
33ce0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
33cf0 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
33d00 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
33d10 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
33d20 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
33d30 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
33d40 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
33d50 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
33d60 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
33d70 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
33d80 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
33d90 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
33da0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
33db0 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
33dc0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
33dd0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
33de0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
33df0 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
33e00 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
33e10 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
33e20 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
33e30 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
33e40 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
33e50 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
33e60 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
33e70 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
33e80 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
33e90 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
33ea0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
33eb0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
33ec0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
33ed0 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
33ee0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
33ef0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
33f00 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
33f10 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
33f20 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
33f30 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
33f40 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
33f50 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
33f60 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
33f70 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
33f80 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
33f90 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33fa0 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62  t( bBulk==0 || b
33fb0 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69  Bulk==1 );.    i
33fc0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
33fd0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
33fe0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
33ff0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
34000 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
34010 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
34020 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20   = i-2+bBulk;.  
34030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
34040 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
34050 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  );.      nxDiv =
34060 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
34070 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62     }.    i = 2-b
34080 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  Bulk;.  }.  nOld
34090 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69   = i+1;.  if( (i
340a0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
340b0 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
340c0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
340d0 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
340e0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
340f0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
34100 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34110 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
34120 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
34130 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
34140 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
34150 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
34160 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
34170 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
34180 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
34190 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
341a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
341b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
341c0 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
341d0 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
341e0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
341f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34200 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
34210 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
34220 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
34230 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
34240 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
34250 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
34260 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
34270 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20  t->aiOvfl[0] && 
34280 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34290 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ow ){.      apDi
342a0 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e  v[i] = pParent->
342b0 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  apOvfl[0];.     
342c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
342d0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
342e0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
342f0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
34300 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
34310 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
34320 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
34330 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
34340 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
34350 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
34360 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34370 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
34380 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
34390 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
343a0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
343b0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
343c0 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
343d0 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
343e0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
343f0 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
34400 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
34410 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
34420 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
34430 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
34440 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
34450 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
34460 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
34470 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
34480 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
34490 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
344a0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
344b0 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
344c0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
344d0 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
344e0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
344f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
34500 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
34510 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
34520 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
34530 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
34540 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
34550 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72  But not if we ar
34560 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  e in secure-dele
34570 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75  te mode. In secu
34580 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a  re-delete mode,.
34590 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
345a0 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
345b0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
345c0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
345d0 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
345e0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
345f0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
34600 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
34610 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
34620 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
34630 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
34640 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
34650 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
34660 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
34670 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
34680 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
34690 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
346a0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
346b0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20  ELETE ){.       
346c0 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20   int iOff;..    
346d0 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54      iOff = SQLIT
346e0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44  E_PTR_TO_INT(apD
346f0 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f  iv[i]) - SQLITE_
34700 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65  PTR_TO_INT(pPare
34710 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  nt->aData);.    
34720 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a      if( (iOff+sz
34730 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74  New[i])>(int)pBt
34740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
34750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34760 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34770 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  PT;.          me
34780 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
34790 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
347a0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  age*));.        
347b0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
347c0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
347d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
347e0 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70   memcpy(&aOvflSp
347f0 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76  ace[iOff], apDiv
34800 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
34810 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b            apDiv[
34820 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  i] = &aOvflSpace
34830 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
34840 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20  t->aData];.     
34850 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34860 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
34870 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
34880 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
34890 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
348a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
348b0 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
348c0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
348d0 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
348e0 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
348f0 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
34900 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
34910 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
34920 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
34930 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
34940 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
34950 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
34960 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
34970 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
34980 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
34990 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
349a0 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
349b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349c0 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
349d0 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
349e0 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a00 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
34a10 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
34a20 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
34a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a40 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
34a50 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
34a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a80 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
34a90 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
34aa0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
34ab0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
34ac0 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
34ad0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
34ae0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
34af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
34b00 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
34b10 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
34b20 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
34b30 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
34b40 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
34b50 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
34b60 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
34b70 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
34b80 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
34b90 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
34ba0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
34bb0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
34bc0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
34bd0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
34be0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
34bf0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
34c00 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
34c10 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34c20 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
34c30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
34c40 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
34c50 76 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ve the divider c
34c60 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
34c70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
34c80 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
34c90 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
34ca0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
34cb0 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
34cc0 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
34cd0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
34ce0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
34cf0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
34d00 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
34d10 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
34d20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
34d30 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
34d40 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
34d50 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
34d60 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
34d70 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
34d80 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
34d90 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
34da0 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
34db0 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
34dc0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
34dd0 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
34de0 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
34df0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
34e00 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
34e10 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
34e20 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
34e30 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
34e40 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
34e50 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
34e60 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
34e70 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
34e80 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
34e90 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
34ea0 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
34eb0 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
34ec0 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
34ed0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
34ee0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
34ef0 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
34f00 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
34f10 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
34f20 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
34f30 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
34f40 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
34f50 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
34f60 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
34f70 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
34f80 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
34f90 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
34fa0 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
34fb0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
34fc0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
34fd0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
34fe0 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
34ff0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
35000 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
35010 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
35020 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
35030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
35040 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
35050 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
35060 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
35070 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
35080 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
35090 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
350a0 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
350b0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
350c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
350d0 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
350e0 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
350f0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
35100 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
35110 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  >0 ){.      for(
35120 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
35130 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
35140 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
35150 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61  lls );.        a
35160 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
35170 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
35180 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
35190 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
351a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
351b0 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
351c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
351d0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
351e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
351f0 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e   *aData = pOld->
35200 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36  aData;.      u16
35210 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64   maskPage = pOld
35220 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20  ->maskPage;.    
35230 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
35240 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66   = pOld->cellOff
35250 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  set;.      for(j
35260 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
35270 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
35280 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
35290 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
352a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
352b0 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20  ndCellv2(aData, 
352c0 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66  maskPage, cellOf
352d0 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20  fset, j);.      
352e0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
352f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
35300 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
35310 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  ]);.        nCel
35320 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
35330 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66   }       .    if
35340 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c  ( i<nOld-1 && !l
35350 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20  eafData){.      
35360 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a  u16 sz = (u16)sz
35370 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38  New[i];.      u8
35380 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61   *pTemp;.      a
35390 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
353a0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
353b0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
353c0 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  sz;.      pTemp 
353d0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
353e0 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63  e1];.      iSpac
353f0 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e1 += sz;.      
35400 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
35410 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
35420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
35430 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42  pace1 <= (int)pB
35440 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
35450 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
35460 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
35470 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
35480 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
35490 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
354a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
354b0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
354c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
354d0 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
354e0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
354f0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
35500 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
35510 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
35520 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
35530 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
35540 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
35550 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
35560 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
35570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
35580 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
35590 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
355a0 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
355b0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
355c0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
355d0 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
355e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
355f0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
35600 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
35610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35620 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
35630 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
35640 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
35650 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
35660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
35670 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
35680 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
35690 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
356a0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
356b0 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
356c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
356d0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
356e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
356f0 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
35700 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
35710 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
35720 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
35730 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
35740 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
35750 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
35760 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
35770 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
35780 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
35790 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
357a0 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
357b0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
357c0 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
357d0 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
357e0 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
357f0 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
35800 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
35810 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
35820 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
35830 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
35840 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
35850 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
35860 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
35870 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
35880 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
35890 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
358a0 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
358b0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
358c0 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
358d0 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
358e0 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
358f0 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
35900 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
35910 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
35920 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
35930 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
35940 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
35950 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
35960 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
35970 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
35980 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
35990 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
359a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
359b0 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
359c0 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
359d0 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
359e0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
359f0 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
35a00 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
35a10 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
35a20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
35a30 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
35a40 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
35a50 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
35a60 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
35a70 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
35a80 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
35a90 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
35aa0 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
35ab0 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
35ac0 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
35ad0 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
35ae0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74  ORRUPT_BKPT; got
35af0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
35b00 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
35b10 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
35b20 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
35b30 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
35b40 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
35b50 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
35b60 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
35b70 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
35b80 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
35b90 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
35ba0 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
35bb0 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
35bc0 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
35bd0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
35be0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
35bf0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
35c00 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
35c10 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
35c20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
35c30 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
35c40 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
35c50 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
35c60 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
35c70 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
35c80 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
35c90 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
35ca0 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
35cb0 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
35cc0 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
35cd0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
35ce0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
35cf0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
35d00 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
35d10 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
35d20 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
35d30 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
35d40 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
35d50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
35d60 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
35d70 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
35d80 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
35d90 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
35da0 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
35db0 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
35dc0 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
35dd0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
35de0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
35df0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
35e00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
35e10 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
35e20 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
35e30 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
35e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35e50 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
35e60 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
35e70 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
35e80 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
35e90 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
35ea0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
35eb0 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
35ec0 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
35ed0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
35ee0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35ef0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
35f00 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ==0 .       || (
35f10 21 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68  !bBulk && szRigh
35f20 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73  t+szCell[d]+2<=s
35f30 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d  zLeft-(szCell[r]
35f40 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  +2)) .    ){.   
35f50 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
35f60 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
35f70 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
35f80 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
35f90 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
35fa0 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
35fb0 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
35fc0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
35fd0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
35fe0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
35ff0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
36000 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
36010 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
36020 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
36030 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
36040 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
36050 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
36060 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
36070 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
36080 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
36090 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
360a0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
360b0 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
360c0 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
360d0 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
360e0 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73   UPDATE:  The as
360f0 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20  sert() below is 
36100 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
36110 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
36120 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69  base.  ** file i
36130 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20  s corrupt.  The 
36140 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
36150 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
36160 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20  reported later. 
36170 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63   ** in this proc
36180 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69  edure so there i
36190 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74  s no need to act
361a0 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20   upon it now..  
361b0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
361c0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
361d0 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
361e0 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
361f0 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e  nCell==0) );.#en
36200 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42  dif..  TRACE(("B
36210 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
36220 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
36230 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
36240 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
36250 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
36260 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
36270 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
36280 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
36290 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
362a0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
362b0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
362c0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
362d0 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
362e0 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
362f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36300 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
36310 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
36320 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
36330 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
36340 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
36350 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
36360 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
36370 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
36380 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
36390 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
363a0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
363b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
363c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
363d0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
363e0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
363f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
36400 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36410 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
36420 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36430 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
36440 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36450 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
36460 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20  , &pgno, (bBulk 
36470 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b  ? 1 : pgno), 0);
36480 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
36490 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
364a0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
364b0 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
364c0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
364d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
364e0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
364f0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
36500 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
36510 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
36520 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
36530 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
36540 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
36550 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
36560 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
36570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36590 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
365a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
365b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
365c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
365d0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
365e0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
365f0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
36600 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
36610 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
36620 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
36630 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
36640 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36650 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
36660 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
36670 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
36680 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
36690 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
366a0 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
366b0 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
366c0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
366d0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
366e0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
366f0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
36700 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
36710 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
36720 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
36730 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
36740 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
36750 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
36760 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
36770 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
36780 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
36790 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
367a0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
367b0 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
367c0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
367d0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
367e0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
367f0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
36800 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
36810 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
36820 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
36830 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
36840 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
36850 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
36860 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
36870 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
36880 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
36890 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
368a0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
368b0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
368c0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
368d0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
368e0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
368f0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
36900 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
36910 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
36920 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
36930 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
36940 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
36950 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
36960 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
36970 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
36980 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
36990 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
369a0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20  e *pT;.      pT 
369b0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
369c0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
369d0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
369e0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
369f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
36a00 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
36a10 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
36a20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
36a30 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
36a40 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
36a50 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
36a60 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
36a70 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
36a80 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
36a90 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
36aa0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36ab0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
36ac0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
36ad0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
36ae0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
36af0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
36b00 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
36b10 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
36b20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
36b30 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
36b40 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36b50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36b60 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
36b70 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
36b80 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
36b90 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
36ba0 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
36bb0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
36bc0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
36bd0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
36be0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
36bf0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
36c00 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
36c10 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
36c20 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
36c30 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
36c40 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
36c50 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
36c60 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
36c70 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
36c80 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
36c90 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
36ca0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
36cb0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
36cc0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
36cd0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
36ce0 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
36cf0 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
36d00 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
36d10 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
36d20 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
36d30 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
36d40 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
36d50 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
36d60 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
36d70 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
36d80 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
36d90 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
36da0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
36db0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
36dc0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
36dd0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
36de0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
36df0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
36e00 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
36e10 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
36e20 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
36e30 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
36e40 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
36e50 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
36e60 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
36e70 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
36e80 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
36e90 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
36ea0 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
36eb0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
36ec0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
36ed0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
36ee0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
36ef0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
36f00 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
36f10 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
36f20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
36f30 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
36f40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
36f50 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
36f60 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
36f70 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
36f80 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
36f90 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
36fa0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
36fb0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
36fc0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
36fd0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
36fe0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
36ff0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
37000 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
37010 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
37020 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
37030 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
37040 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
37050 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37060 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
37070 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
37080 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
37090 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
370a0 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
370b0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
370c0 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
370d0 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69  sz = 4 + putVari
370e0 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e  nt(&pCell[4], in
370f0 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  fo.nKey);.      
37100 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
37110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37120 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
37130 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
37140 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
37150 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
37160 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
37170 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
37180 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
37190 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
371a0 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
371b0 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
371c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
371d0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
371e0 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
371f0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
37200 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74        ** (see bt
37210 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
37220 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
37230 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
37240 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
37250 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
37260 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
37270 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
37280 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
37290 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
372a0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
372b0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
372c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
372d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
372e0 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
372f0 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
37300 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
37310 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
37320 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
37330 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
37340 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
37350 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
37360 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
37370 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
37380 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
37390 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
373a0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
373b0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
373c0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
373d0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
373e0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
373f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
37400 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
37410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37420 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
37430 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
37440 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
37450 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
37460 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c     assert( iOvfl
37470 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42  Space <= (int)pB
37480 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
37490 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
374a0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
374b0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
374c0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
374d0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
374e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
374f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
37500 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
37510 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37520 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
37530 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
37540 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
37550 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
37560 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
37570 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
37580 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
37590 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
375a0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
375b0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
375c0 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
375d0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
375e0 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
375f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
37600 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
37610 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
37620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
37630 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
37640 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
37650 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
37660 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
37670 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
37680 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
37690 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
376a0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
376b0 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
376c0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
376d0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
376e0 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
376f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37700 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
37710 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
37720 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
37730 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
37740 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
37750 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
37760 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
37770 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
37780 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
37790 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
377a0 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
377b0 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
377c0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
377d0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
377e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
377f0 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
37800 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
37810 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
37820 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
37830 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
37840 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
37850 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
37860 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
37870 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
37880 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
37890 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
378a0 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
378b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
378c0 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
378d0 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
378e0 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
378f0 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
37900 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
37910 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
37920 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
37930 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
37940 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
37950 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
37960 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37970 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
37980 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
37990 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
379a0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
379b0 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
379c0 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
379d0 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
379e0 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
379f0 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
37a00 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
37a10 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
37a20 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
37a30 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
37a40 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
37a50 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
37a60 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
37a70 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
37a80 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
37a90 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
37aa0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
37ab0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
37ac0 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
37ad0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
37ae0 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
37af0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
37b00 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
37b10 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
37b20 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
37b30 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
37b40 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
37b50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
37b60 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
37b70 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
37b80 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
37b90 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
37ba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
37bb0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
37bc0 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
37bd0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
37be0 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
37bf0 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
37c00 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
37c10 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
37c20 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
37c30 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
37c40 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
37c50 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
37c60 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
37c70 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
37c80 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
37c90 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
37ca0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
37cb0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
37cc0 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
37cd0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
37ce0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
37cf0 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
37d00 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
37d10 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
37d20 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
37d30 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
37d40 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
37d50 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
37d60 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
37d70 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
37d80 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
37d90 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
37da0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
37db0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
37dc0 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
37dd0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
37de0 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
37df0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
37e00 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
37e10 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
37e20 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
37e30 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
37e40 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
37e50 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
37e60 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
37e70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
37e80 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
37e90 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
37ea0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
37eb0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
37ec0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
37ed0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
37ee0 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
37ef0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
37f00 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
37f10 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
37f20 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
37f30 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
37f40 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
37f50 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
37f60 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
37f70 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
37f80 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
37f90 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
37fa0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
37fb0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
37fc0 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
37fd0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
37fe0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
37ff0 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
38000 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
38010 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
38020 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
38030 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
38040 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
38050 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
38060 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
38070 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
38080 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
38090 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
380a0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
380b0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
380c0 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
380d0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
380e0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
380f0 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
38100 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
38110 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
38120 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
38130 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
38140 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
38150 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
38160 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
38170 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
38180 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
38190 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
381a0 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
381b0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
381c0 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
381d0 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
381e0 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
381f0 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
38200 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
38210 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20  ld->aiOvfl[0] : 
38220 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20  -1);.    j = 0; 
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
38250 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62  urrent 'old' sib
38260 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
38270 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   k = 0;         
38280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38290 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
382a0 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67  new' sibling pag
382b0 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
382c0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
382d0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76  .      int isDiv
382e0 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ider = 0;.      
382f0 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f  while( i==iNextO
38300 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ld ){.        /*
38310 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
38320 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
38330 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
38340 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20  st cell on old. 
38350 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
38360 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65  g page j. If the
38370 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
38380 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
38390 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
383a0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
383b0 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64  n cell i was a d
383c0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a  ivider cell. */.
383d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
383e0 6a 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28  j+1 < ArraySize(
383f0 61 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20  apCopy) );.     
38400 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c     assert( j+1 <
38410 20 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 20   nOld );.       
38420 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2