/ Hex Artifact Content
Login

Artifact 4fc3690a4a8f802e167f40261cbff8271f820599:


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 31 35 30 5d 3b 20 20 20   aSpace[150];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c   pIdxKey);.  }el
5b00: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b30: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b40: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b50: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b60: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5b80: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5b90: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bb0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5bc0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bd0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5be0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5bf0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c00: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c10: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c20: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c30: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c40: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c50: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c60: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5c80: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5c90: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5ca0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cb0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5cc0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cd0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5cf0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d00: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d10: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5d80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5d90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5da0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5db0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5dc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5dd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5de0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5df0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e10: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e20: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e50: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e60: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e70: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5e80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5e90: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ea0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5eb0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
5ee0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ef0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
5f00: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
5f10: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
5f20: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
5f30: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f40: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
5f50: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
5f60: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
5f70: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
5f80: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
5f90: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
5fa0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
5fb0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20  ed at.  Cursors 
5fc0: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
5fd0: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
5fe0: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73  ointing.** at is
5ff0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
6000: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a  m under them..**
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
6030: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
6040: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
6050: 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
6060: 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65  *pHasMoved is se
6070: 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20  t to one if the 
6080: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6090: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
60a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
60b0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
60c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
60d0: 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29   int *pHasMoved)
60e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  {.  int rc;..  r
60f0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6100: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6110: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6120: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6130: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6140: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
6150: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6160: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b  ALID || pCur->sk
6170: 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a 20 20 20  ipNext!=0 ){.   
6180: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
61a0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
61c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
61d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
61e0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
61f0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6200: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6210: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6220: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6230: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6240: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6260: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6270: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6280: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6290: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
62a0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
62b0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
62c0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
62d0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
62e0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
62f0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
6300: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
6310: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
6320: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
6330: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
6340: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
6350: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6360: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
6370: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6380: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
6390: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
63a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
63d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
63e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
63f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
6400: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
6410: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
6420: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
6430: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
6440: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
6450: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
6480: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
6490: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
64a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
64b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
64c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
64d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
64e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
64f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
6500: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
6510: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
6520: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
6530: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6540: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
6550: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
6560: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
6570: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
6580: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
6590: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
65a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
65b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
65c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
65d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
65e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
65f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
6600: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
6610: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6620: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
6630: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
6640: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6650: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
6660: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6670: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6680: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6690: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
66a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
66b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
66c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
66d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
66e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
66f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
6700: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
6720: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
6730: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
6740: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
6750: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
6760: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6770: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6780: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
6790: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
67a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
67b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
67c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
67d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
67e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
67f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
6800: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
6810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
6820: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
6830: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
6840: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6850: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6860: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6870: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6880: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6890: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
68a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
68b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
68c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
68d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
68e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
68f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6900: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
6910: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
6920: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
6930: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
6940: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6950: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6960: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
6970: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
6980: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
6990: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
69a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
69b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
69c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
69d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
69e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
69f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
6a00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6a10: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
6a20: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
6a30: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
6a40: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
6a50: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
6a60: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
6a70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
6a80: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6aa0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6ab0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6ac0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6ad0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6ae0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6af0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6b00: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6b10: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6b20: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
6b30: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
6b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6b60: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
6b70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6b80: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
6b90: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
6ba0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
6bb0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
6bc0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
6bd0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
6be0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
6bf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
6c00: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
6c10: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
6c20: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
6c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6c40: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
6c50: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6c60: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
6c70: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
6c80: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
6c90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
6cb0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6cc0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6cd0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
6ce0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
6cf0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
6d00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
6d10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
6d20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
6d30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
6d40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
6d50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6d60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6d70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6d80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6d90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6da0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6db0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6dc0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6dd0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6de0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
6df0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6e00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
6e10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
6e20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
6e30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
6e40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
6e50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
6e60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
6e70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6e80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
6e90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6ea0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6eb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
6ec0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
6ed0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
6ee0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
6ef0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
6f00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
6f10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
6f20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
6f30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6f40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
6f50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6f60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
6f70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
6f80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
6f90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6fb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
6fc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
6fd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6fe0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
6ff0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7000: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7010: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7020: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7030: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7040: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7050: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7060: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7070: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7080: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7090: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
70a0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
70b0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
70c0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
70d0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
70e0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
70f0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
7110: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
7120: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
7130: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7140: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
7150: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
7160: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
7170: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
7180: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
7190: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
71a0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
71b0: 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29  dCellv2(D,M,O,I)
71c0: 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28   (D+(M&get2byte(
71d0: 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a  D+(O+2*(I)))))..
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
71f0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
7200: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
7210: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
7220: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
7230: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
7240: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
7250: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
7260: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
7270: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7280: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
7290: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
72a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
72b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
72c0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
72d0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
72e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
72f0: 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65  k;.    k = pPage
7300: 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->aiOvfl[i];.   
7310: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
7320: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
7330: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
7340: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f  eturn pPage->apO
7350: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  vfl[i];.      }.
7360: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
7370: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7380: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
7390: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
73a0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
73b0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
73c0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
73d0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
73e0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
73f0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
7400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
7410: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
7420: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
7430: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
7440: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
7450: 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  nd btreeParseCel
7460: 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73  lPtr() .** takes
7470: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7480: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65  e body of the ce
7490: 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64  ll as its second
74a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
74b0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c   Within this fil
74c0: 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c  e, the parseCell
74d0: 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20  () macro can be 
74e0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f  called instead o
74f0: 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  f.** btreeParseC
7500: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
7510: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
7520: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
7530: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
7540: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7550: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
7560: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7570: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7580: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7590: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
75a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
75b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
75c0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
75d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
75e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
75f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7600: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
7630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
7640: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
7650: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7670: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7680: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
76a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
76b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
76c0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
76d0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
76e0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
76f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
7700: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
7710: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
7720: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
7730: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
7740: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
7750: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
7760: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7770: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72       n += getVar
7780: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
7790: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
77a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
77b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
77c0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
77d0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
77e0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
77f0: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7800: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7820: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7830: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7840: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7850: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7860: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7870: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7880: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7890: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
78a0: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
78b0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
78c0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
78d0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
78e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
78f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7900: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7910: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7920: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7930: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7940: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7950: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7960: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7970: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7980: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7990: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
79a0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
79b0: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
79c0: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
79d0: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
79e0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
79f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7a00: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7a10: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7a20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7a30: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7a40: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7a50: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7a60: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7a70: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7a80: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7a90: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7aa0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7ab0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7ac0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7ad0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7ae0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7af0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7b00: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7b10: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7b20: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7b30: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7b40: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7b50: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7b60: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7b70: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7b80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7b90: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7ba0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7bb0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7bc0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7bd0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7be0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7bf0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7c00: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7c10: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7c20: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7c30: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c40: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c50: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7c60: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7c70: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c80: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c90: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7ca0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7cb0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7cc0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7cd0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7ce0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7cf0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7d00: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7d10: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7d20: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7d30: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7d40: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7d50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7d60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7d70: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7d90: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
7da0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
7db0: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
7dc0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
7dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
7de0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
7df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
7e00: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
7e10: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
7e20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7e30: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
7e40: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
7e50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
7e60: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
7e70: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
7e80: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
7e90: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7ea0: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
7eb0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
7ec0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
7ed0: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
7ee0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
7ef0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f00: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
7f10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7f20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7f30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7f40: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7f60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
7f70: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
7f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
7f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
7fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
7fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
7fc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7fd0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
7ff0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8000: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8010: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8020: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8030: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
8040: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
8050: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
8060: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
8070: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
8080: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
8090: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
80a0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
80b0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
80c0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
80d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
80e0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
80f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8100: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8110: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8120: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8130: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
8140: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
8150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
81a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
81b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
81c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
81d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
81e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
81f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8280: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8290: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
82a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
82b0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
82c0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
82d0: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
82e0: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
82f0: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8300: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8310: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8330: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
8340: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
8350: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8360: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8370: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8380: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8390: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
83a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
83b0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
83c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
83d0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
83e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
83f0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8400: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8410: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8420: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8430: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8440: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
8450: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8460: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8470: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
8480: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8490: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
84a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
84b0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
84c0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
84d0: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
84e0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
84f0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8500: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8510: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8520: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8530: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8540: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8550: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8570: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8580: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8590: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
85a0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
85b0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
85c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
85d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
85e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
85f0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8600: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8610: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8620: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8630: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
8640: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
8650: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
8660: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
8670: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
8680: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
8690: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
86a0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
86b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
86c0: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
86d0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
86e0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
86f0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8700: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8710: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8720: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8730: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
8740: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
8750: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8760: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
8770: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
8780: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
8790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
87a0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
87b0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
87c0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
87d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
87e0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
87f0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8800: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8810: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8820: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8830: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8840: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8850: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8870: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8880: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8890: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
88a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
88b0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
88c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
88d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
88e0: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
88f0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8900: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8910: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8920: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8930: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8940: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8950: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8960: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8970: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8980: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8990: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
89a0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
89b0: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
89c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
89d0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
89e0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
89f0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8a00: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8a10: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8a20: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8a30: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8a40: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8a50: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8a60: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8a70: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8a80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8a90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8aa0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8ac0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8ad0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8b00: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b20: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8b30: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8b40: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8b70: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8b80: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8ba0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8bb0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8bd0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8be0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8c00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8c10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8c20: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c30: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8c40: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8c50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8c60: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8c70: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8c80: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8ca0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8cb0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8cc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8cd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8ce0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8cf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8d00: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8d10: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8d20: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8d30: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8d40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8d50: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8d60: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8d70: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8d80: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8d90: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
8da0: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
8db0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8dc0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8dd0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8e00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8e10: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
8e20: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
8e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8e40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
8e50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8e60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8e70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8e80: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
8e90: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
8ea0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
8eb0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
8ec0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8ed0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
8ee0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
8ef0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
8f00: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
8f10: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
8f20: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
8f30: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
8f40: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
8f50: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8f60: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8f70: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
8f80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8f90: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
8fa0: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
8fb0: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
8fc0: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
8fd0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
8fe0: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
8ff0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9000: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9010: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9020: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9030: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
9040: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
9050: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
9060: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
9070: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
9080: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
9090: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
90a0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
90b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90c0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
90d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90e0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
90f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9100: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9110: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9120: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9130: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
9140: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
9150: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
9160: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
9170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9180: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
9190: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
91a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
91b0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
91c0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
91d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9200: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9210: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9220: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9230: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
9240: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
9250: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9260: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9270: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9280: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9290: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
92a0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
92c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92d0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
92e0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
92f0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9310: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9320: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9330: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9340: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9350: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9360: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9370: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9380: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
93a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
93b0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
93c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
93d0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
93e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
93f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9400: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9410: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9420: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9430: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9440: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
9450: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
9460: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
9470: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9480: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
9490: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
94a0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
94b0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
94c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
94d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
94e0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
94f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9500: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9540: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9550: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
9560: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
9570: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
9580: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
9590: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
95a0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
95b0: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
95c0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
95d0: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
95e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
95f0: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9600: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9610: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9620: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9630: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
9640: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
9650: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
9660: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
9670: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
9680: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
9690: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
96a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
96b0: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
96c0: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
96d0: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
96e0: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
96f0: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9700: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9710: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9720: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9730: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
9740: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
9750: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
9760: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
9770: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
9780: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
9790: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
97a0: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
97b0: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
97c0: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
97d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
97e0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
97f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9800: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9810: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9820: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9830: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9840: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9850: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9860: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9870: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9880: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9890: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
98a0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
98b0: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98e0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
98f0: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9900: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9930: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9940: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9950: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9960: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9970: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9980: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9990: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
99a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
99b0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
99c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
99d0: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
99e0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
99f0: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9a00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9a10: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9a20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9a30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a40: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9a50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9a60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9a70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9a80: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9a90: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9aa0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9ab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ac0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ae0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9af0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9b00: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9b10: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9b20: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9b30: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9b40: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9b50: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9b60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9b70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9b80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9b90: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9ba0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9bb0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9bc0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9bd0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9be0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9c10: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9c20: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9c30: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9c40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9c50: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9c60: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9c70: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9c80: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9c90: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9ca0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9cb0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9cc0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9cd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9ce0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9cf0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9d00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9d10: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9d20: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9d30: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9d40: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9d50: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9d60: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9d70: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9d80: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9d90: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
9da0: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
9db0: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
9dc0: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
9dd0: 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  gh to accommodat
9de0: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
9df0: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
9e00: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
9e10: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
9e20: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
9e30: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
9e40: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9e60: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
9e70: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63   */.      if( pc
9e80: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
9e90: 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20   pc<addr+4 ){.  
9ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9eb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ed0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
9ee0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
9ef0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
9f00: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
9f10: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
9f20: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
9f30: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
9f40: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9f50: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
9f60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
9f70: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
9f80: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
9f90: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
9fa0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
9fb0: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
9fc0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9fd0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
9fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
9ff0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a000: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a010: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a020: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
a030: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
a040: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
a050: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
a060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a080: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0a0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a0b0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a0c0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a0d0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a0e0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
a0f0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a100: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a110: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a120: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
a130: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
a140: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
a150: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
a160: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
a170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a180: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a190: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a1a0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
a1b0: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
a1c0: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
a1d0: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
a1e0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
a1f0: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
a200: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
a210: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
a220: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
a230: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
a240: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
a250: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a260: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a270: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a280: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a290: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
a2b0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
a2c0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
a2d0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
a2e0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
a2f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a300: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
a310: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a320: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
a330: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
a340: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
a350: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
a360: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
a370: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
a380: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
a390: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
a3a0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
a3b0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
a3c0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
a3d0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
a3e0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
a3f0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
a400: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
a410: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
a420: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
a430: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a440: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
a450: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
a460: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a470: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
a480: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
a490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a4b0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
a4c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
a4d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
a4e0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
a4f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
a500: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
a510: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
a520: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a530: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
a540: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
a550: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
a560: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
a570: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
a580: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
a590: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
a5a0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
a5b0: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
a5c0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
a5d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a5e0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
a5f0: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
a600: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
a610: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
a640: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
a650: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
a660: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a670: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a680: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
a690: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a6b0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a6c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a6d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
a6e0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
a6f0: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
a700: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
a710: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
a720: 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70   size) <= (int)p
a730: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a740: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a750: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a760: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a770: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a780: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a790: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a7a0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a7b0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a7c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
a7d0: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
a7e0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a7f0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a800: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a810: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a820: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a830: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a840: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a850: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a860: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a870: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a880: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a890: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a8a0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a8b0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a8c0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a8d0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a8e0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a8f0: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a900: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a910: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a920: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a930: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a940: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a950: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a960: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a970: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a980: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a990: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a9a0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a9b0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a9c0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a9d0: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a9e0: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a9f0: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
aa00: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
aa10: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
aa20: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
aa30: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
aa40: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
aa50: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
aa60: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
aa70: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
aa80: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
aa90: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
aaa0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
aab0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
aac0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
aad0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
aae0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
aaf0: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ab00: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ab10: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
ab20: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
ab30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ab40: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ab50: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
ab60: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
ab70: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
ab80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ab90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
aba0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
abb0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
abc0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
abd0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
abe0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
abf0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
ac00: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
ac10: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
ac20: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
ac30: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
ac40: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
ac50: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
ac60: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
ac70: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
ac80: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
ac90: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
aca0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
acb0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
acc0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
acd0: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
ace0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
acf0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ad00: 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70  pbegin <= (int)p
ad10: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ad20: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
ad30: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
ad40: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
ad50: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
ad60: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
ad70: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
ad80: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
ad90: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
ada0: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
adb0: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
adc0: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
add0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
ade0: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
adf0: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20  nt)data[hdr+7]) 
ae00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ae10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ae20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
ae30: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
ae40: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
ae50: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
ae60: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
ae70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ae80: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
ae90: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
aea0: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
aeb0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
aec0: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
aed0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
aee0: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
aef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
af00: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
af10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
af20: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
af30: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
af40: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
af50: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
af60: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
af70: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
af80: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
af90: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
afa0: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
afb0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
afc0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
afd0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
afe0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
aff0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
b000: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b010: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
b020: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b030: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
b040: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b050: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
b060: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b070: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b080: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b0a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
b0b0: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b0c0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b0d0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b0e0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b0f0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b100: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b110: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b120: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
b130: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
b140: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
b150: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
b160: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
b170: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
b180: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b190: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
b1a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b1b0: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
b1c0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
b1d0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
b1e0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b1f0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
b200: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b210: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b220: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
b230: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
b240: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
b250: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
b260: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
b270: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
b280: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
b290: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
b2a0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
b2b0: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
b2c0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
b2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b2e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b2f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b300: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
b310: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
b320: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
b330: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
b340: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
b350: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
b360: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b370: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
b380: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
b390: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
b3a0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
b3b0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b3c0: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
b3d0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
b3e0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b3f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
b400: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
b410: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b420: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b430: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b440: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b450: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
b460: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
b470: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
b480: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
b490: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
b4a0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b4b0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b4c0: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b4d0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b4e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
b4f0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
b500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b510: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
b520: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
b530: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
b540: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
b550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b560: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b570: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b580: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b590: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b5a0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b5b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b5c0: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b5d0: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b5e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b5f0: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b600: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b610: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b620: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b630: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b640: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b650: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b660: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b670: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b680: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b690: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b6a0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b6b0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b6c0: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b6d0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b6e0: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b6f0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b700: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b710: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b720: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b730: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b740: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b750: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b760: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b770: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b780: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b790: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b7a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b7b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b7c0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
b7d0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b7e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b7f0: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
b800: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
b810: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
b820: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b830: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b840: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b850: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
b860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b870: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b880: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b890: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
b8a0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b8b0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b8c0: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
b8d0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
b8e0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
b8f0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
b900: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
b910: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b920: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b930: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b940: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
b950: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
b960: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
b970: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
b980: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b990: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
b9a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b9b0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
b9c0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b9d0: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
b9e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
b9f0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
ba00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
ba10: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
ba20: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
ba30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
ba40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
ba50: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
ba60: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
ba70: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
ba80: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
ba90: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
baa0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
bab0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
bac0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bad0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bae0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
baf0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bb00: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
bb10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bb20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
bb30: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
bb40: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
bb50: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
bb60: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
bb70: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
bb80: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
bb90: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
bba0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
bbb0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
bbc0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
bbd0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
bbe0: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
bbf0: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
bc00: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
bc10: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
bc20: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
bc30: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bc40: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
bc50: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bc60: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bc70: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bc80: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bc90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bca0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bcb0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bcc0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bcd0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bce0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bcf0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bd00: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bd10: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bd20: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bd30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd40: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bd50: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bd60: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bd70: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bd80: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bd90: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
bda0: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
bdb0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
bdc0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
bdd0: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
bde0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
bdf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
be00: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
be10: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
be20: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
be30: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
be40: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
be50: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
be60: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
be70: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
be80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
be90: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
bea0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
beb0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
bec0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
bed0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
bee0: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
bef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
bf00: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
bf10: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
bf20: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
bf30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bf40: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
bf50: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
bf60: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
bf70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bf80: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
bf90: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
bfa0: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
bfb0: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
bfc0: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
bfd0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
bfe0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
bff0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
c000: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
c010: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c020: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
c030: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c040: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c050: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c060: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c070: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c080: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c090: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0b0: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
c0c0: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
c0d0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
c0e0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
c0f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c100: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
c110: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c120: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c130: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c140: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
c150: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c160: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c170: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c180: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c190: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c1a0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c1b0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c1c0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c1d0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c1e0: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c1f0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c200: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c210: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c220: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c230: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c240: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c250: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c260: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c270: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c280: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c290: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c2a0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c2b0: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c2c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c2d0: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c2e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c2f0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c300: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c310: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c320: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c330: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c340: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c350: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c360: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c370: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20  e last byte of. 
c380: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
c390: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
c3a0: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c3b0: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c3c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c3f0: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c400: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c410: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c420: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c430: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c440: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c450: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c460: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c470: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c480: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c490: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c4a0: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c4b0: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c4c0: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c4d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c4e0: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c4f0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c500: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c510: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c520: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c530: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c540: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c550: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c560: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c570: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c580: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c590: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c5a0: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c5b0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c5c0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c5d0: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c5e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c600: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c610: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c620: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c630: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c650: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c660: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c670: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c680: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c690: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c6a0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c6b0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c6c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c6d0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c6e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c6f0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c700: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c710: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c720: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c730: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c740: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c750: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c760: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c770: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c780: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c790: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
c7a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c7b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c7c0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c7d0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
c7e0: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
c7f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c800: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c810: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
c820: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c830: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c840: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c870: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
c880: 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
c890: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
c8a0: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
c8b0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
c8c0: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
c8d0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
c8e0: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
c8f0: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
c900: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
c910: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
c920: 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20  AF)==0 ?1:0);.  
c930: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c940: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
c950: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c960: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c970: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
c980: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
c990: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c9a0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
c9b0: 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
c9c0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
c9d0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
c9e0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
c9f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
ca00: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
ca10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
ca20: 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
ca30: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
ca40: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
ca50: 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
ca60: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ca70: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
ca80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
ca90: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
caa0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
cab0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
cac0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
cad0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
cae0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
caf0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
cb00: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
cb10: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
cb20: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
cb30: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
cb40: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
cb50: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
cb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
cb70: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
cb80: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
cb90: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
cba0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
cbb0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
cbc0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
cbd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
cbe0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
cbf0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
cc00: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
cc10: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
cc20: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
cc30: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
cc40: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
cc50: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
cc60: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
cc70: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
cc80: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
cc90: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
cca0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
ccb0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
ccc0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
ccd0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
cce0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
ccf0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
cd00: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
cd10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
cd20: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
cd30: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
cd40: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
cd50: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
cd60: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
cd70: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
cd80: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
cd90: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
cda0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
cdb0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
cdc0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
cdd0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
cde0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
cdf0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
ce00: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
ce10: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
ce20: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
ce30: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
ce40: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
ce50: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
ce60: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
ce70: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
ce80: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
ce90: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
cea0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
ceb0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
cec0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
ced0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
cee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cef0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
cf00: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
cf10: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
cf20: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
cf30: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
cf40: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
cf50: 6e 74 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  ntent,       /* 
cf60: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
cf70: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
cf80: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f   */.  int bReado
cf90: 6e 6c 79 20 20 20 20 20 20 20 20 2f 2a 20 54 72  nly        /* Tr
cfa0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
cfb0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
cfc0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
cfd0: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
cfe0: 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 66 6c 61  bPage;.  int fla
cff0: 67 73 20 3d 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  gs = (noContent 
d000: 3f 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f  ? PAGER_ACQUIRE_
d010: 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 29 20 0a  NOCONTENT : 0) .
d020: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 62              | (b
d030: 52 65 61 64 6f 6e 6c 79 20 3f 20 50 41 47 45 52  Readonly ? PAGER
d040: 5f 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c  _ACQUIRE_READONL
d050: 59 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72  Y : 0);..  asser
d060: 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
d070: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
d080: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d090: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d0a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d0b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d0c0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
d0d0: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
d0e0: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
d0f0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
d100: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d110: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
d120: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
d130: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
d140: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
d150: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d160: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
d170: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d180: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
d190: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
d1a0: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
d1b0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d1c0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
d1d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
d1e0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
d1f0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
d200: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
d210: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
d220: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
d230: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
d240: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
d250: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
d260: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d280: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d290: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
d2a0: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
d2b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
d2c0: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
d2d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
d2e0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d2f0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d300: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
d310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d320: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
d330: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d340: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
d350: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
d360: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
d370: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
d380: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
d390: 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
d3a0: 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
d3b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
d3c0: 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
d3d0: 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
d3e0: 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
d3f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
d400: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
d410: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
d420: 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
d430: 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
d440: 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
d450: 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65  n (int)btreePage
d460: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
d470: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d480: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d490: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
d4a0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
d4b0: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
d4c0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
d4d0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
d4e0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
d4f0: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
d500: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
d510: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
d520: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d530: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
d540: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d550: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
d560: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
d570: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
d580: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
d590: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
d5a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
d5b0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
d5c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d5f0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d600: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
d610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d620: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d630: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d640: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
d650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d660: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
d670: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
d680: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 72 65 61  /* True if a rea
d6b0: 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
d6c0: 67 65 20 69 73 20 6f 6b 20 2a 2f 0a 29 7b 0a 20  ge is ok */.){. 
d6d0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
d6e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d6f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d700: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  ) );..  if( pgno
d710: 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
d720: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
d730: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d740: 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
d750: 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
d760: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
d770: 70 70 50 61 67 65 2c 20 30 2c 20 62 52 65 61 64  ppPage, 0, bRead
d780: 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72  only);.    if( r
d790: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d7a0: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d7b0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d7c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d7d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d7e0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d7f0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d800: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d810: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d830: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d840: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d860: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d870: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d880: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d890: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d8a0: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d8b0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d8c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d8d0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d8e0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d8f0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d900: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d910: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d920: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d930: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d940: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d950: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d960: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d970: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d980: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d990: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d9a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d9b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d9c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d9d0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d9e0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d9f0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
da00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
da10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
da20: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
da30: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
da40: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
da50: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
da60: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
da70: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
da80: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
da90: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
daa0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
dab0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
dac0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
dad0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
dae0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
daf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
db00: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
db10: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
db20: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
db30: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
db40: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
db50: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
db60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
db70: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
db80: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
db90: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
dba0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
dbb0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
dbc0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
dbd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dbe0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dbf0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
dc00: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
dc10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dc20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dc30: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
dc40: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
dc50: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
dc60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
dc70: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dc80: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
dc90: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
dca0: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
dcb0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
dcc0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
dcd0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
dce0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
dcf0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
dd00: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
dd10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
dd20: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
dd30: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
dd40: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
dd50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
dd60: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
dd70: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
dd80: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
dd90: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
dda0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
ddb0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
ddc0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
ddd0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
dde0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
ddf0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
de00: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
de10: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
de20: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
de30: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
de40: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
de60: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
de70: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
de80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
de90: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
dea0: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
deb0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
dec0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
ded0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
dee0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
def0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
df00: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
df10: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
df20: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
df30: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
df40: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
df50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
df60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
df70: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
df80: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
df90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
dfa0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
dfb0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
dfc0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
dfd0: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
dfe0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
dff0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
e000: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
e010: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
e020: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
e030: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
e040: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
e050: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
e060: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
e070: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
e080: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
e090: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
e0a0: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
e0b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
e0c0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
e0d0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
e0e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e0f0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
e100: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
e110: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
e120: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
e130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
e140: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
e150: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
e160: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
e170: 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45  ts like.** BTREE
e180: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
e190: 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52  d/or BTREE_MEMOR
e1a0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
e1b0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
e1c0: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
e1d0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e1e0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
e1f0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
e200: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
e210: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
e220: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
e230: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
e240: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
e250: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
e260: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
e270: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
e280: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e290: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
e2a0: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
e2b0: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
e2c0: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
e2d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e2e0: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
e2f0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
e300: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e310: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
e320: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
e330: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e340: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
e350: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e360: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e370: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e380: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e390: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e3a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e3b0: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e3c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e3d0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e3e0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e3f0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e400: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e410: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e420: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e440: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e450: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e460: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e470: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e480: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e490: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e4a0: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e4b0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4d0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e4e0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e4f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e500: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e510: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e520: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e530: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e540: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e550: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e560: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e570: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e580: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e5a0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e5b0: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e5c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e5d0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e5e0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e5f0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e600: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e610: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e620: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e640: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e650: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e660: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e670: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e680: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e690: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e6a0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e6b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e6c0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e6d0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e6e0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e700: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e710: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e720: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e730: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e740: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e750: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e760: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e790: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e7a0: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20  pInMemory(db)). 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61        || (vfsFla
e7d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e7e0: 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
e7f0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
e800: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e810: 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61  ( pVfs!=0 );.  a
e820: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e830: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e840: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e850: 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d  ( (flags&0xff)==
e860: 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c  flags );   /* fl
e870: 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74  ags fit in 8 bit
e880: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  s */..  /* Only 
e890: 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  a BTREE_SINGLE d
e8a0: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42  atabase can be B
e8b0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a  TREE_UNORDERED *
e8c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
e8d0: 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44  gs & BTREE_UNORD
e8e0: 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61  ERED)==0 || (fla
e8f0: 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
e900: 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  E)!=0 );..  /* A
e910: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e920: 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73  tabase is always
e930: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64   a temporary and
e940: 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f  /or ephemeral */
e950: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e960: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e970: 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62  )==0 || isTempDb
e980: 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d   );..  if( isMem
e990: 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
e9a0: 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
e9b0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
e9c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e9d0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
e9e0: 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
e9f0: 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
ea00: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
ea10: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
ea20: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
ea30: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
ea40: 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  B;.  }.  p = sql
ea50: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
ea60: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
ea70: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
ea80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ea90: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
eaa0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
eab0: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
eac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ead0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
eae0: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
eaf0: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
eb00: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
eb10: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
eb20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
eb30: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
eb40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eb50: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
eb60: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
eb70: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
eb80: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
eb90: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
eba0: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
ebb0: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
ebc0: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
ebd0: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
ebe0: 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
ebf0: 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
ec00: 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
ec10: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
ec20: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
ec30: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
ec40: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
ec50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
ec60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
ec70: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
ec80: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
ec90: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
eca0: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
ecb0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
ecc0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
ecd0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
ece0: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
ecf0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
ed00: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
ed10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
ed20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ed30: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
ed40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ed50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
ed60: 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
ed70: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
ed80: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
ed90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
eda0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
edb0: 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20  name)+1);.      
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
edd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
ede0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
edf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
ee20: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
ee30: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ee40: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ee50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ee60: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ee70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ee80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ee90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
eea0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
eeb0: 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
eec0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
eed0: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
eee0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
eef0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
ef00: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
ef10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ef20: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
ef30: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
ef40: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
ef50: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ef60: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
ef70: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
ef80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ef90: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
efa0: 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
efb0: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
efc0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
efd0: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
efe0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
eff0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f000: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
f010: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
f020: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
f030: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
f040: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
f050: 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f070: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
f080: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
f090: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
f0a0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
f0b0: 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
f0c0: 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
f0d0: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
f0e0: 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
f0f0: 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
f100: 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
f110: 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
f120: 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
f130: 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
f140: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f150: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f160: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
f170: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f180: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f190: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
f1a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f1b0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f1c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
f1d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f1e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
f1f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f200: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
f210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f230: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f240: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
f250: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
f260: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f290: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
f2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f2b0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f2c0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
f2d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
f2e0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
f2f0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
f300: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
f310: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
f320: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
f330: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
f340: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
f350: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
f360: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
f370: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
f380: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
f390: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
f3a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f3b0: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
f3c0: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
f3d0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
f3e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f3f0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
f400: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
f420: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
f430: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f440: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
f450: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
f460: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
f470: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
f480: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
f490: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
f4a0: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
f4b0: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
f4c0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
f4d0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
f4e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
f4f0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
f510: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
f520: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
f530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f540: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
f550: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
f560: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f570: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
f580: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f590: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
f5a0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f5b0: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
f5c0: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
f5d0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
f5e0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
f5f0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
f600: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
f620: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f630: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
f640: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
f650: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
f660: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
f670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f680: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
f690: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
f6a0: 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
f6b0: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
f6c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f6e0: 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
f6f0: 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
f700: 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
f710: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f720: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f730: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f740: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f750: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f760: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f770: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f780: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f7a0: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f7b0: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f7c0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f7d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f7e0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f7f0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f800: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f810: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f820: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f830: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f840: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f850: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
f860: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
f870: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
f880: 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
f890: 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
f8a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f8b0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
f8c0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
f8d0: 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
f8e0: 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
f8f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f900: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
f910: 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
f920: 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
f930: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f940: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
f950: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
f960: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
f970: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
f980: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
f990: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
f9a0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
f9b0: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
f9c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f9d0: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
f9e0: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
f9f0: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
fa00: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
fa10: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
fa20: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
fa30: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
fa40: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
fa50: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
fa60: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
fa70: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
fa80: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
fa90: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
faa0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
fab0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
fac0: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
fad0: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
fae0: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
faf0: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
fb00: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
fb10: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
fb20: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
fb30: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
fb40: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
fb50: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
fb60: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
fb70: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
fb80: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
fb90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
fba0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
fbb0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
fbc0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
fbd0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fbe0: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
fbf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
fc00: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
fc10: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
fc20: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
fc30: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
fc40: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
fc50: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
fc60: 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
fc70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fc80: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fc90: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
fca0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fcb0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
fcc0: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
fcd0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
fce0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
fcf0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
fd00: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
fd10: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fd20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
fd30: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
fd40: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
fd50: 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
fd60: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
fd70: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
fd80: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
fd90: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
fda0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
fdb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
fdc0: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
fdd0: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
fde0: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
fdf0: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
fe00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fe10: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fe20: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
fe30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
fe40: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
fe50: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
fe60: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
fe70: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
fe80: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
fe90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
fea0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
feb0: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
fec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
fed0: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
fee0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
fef0: 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  1;.      MUTEX_L
ff00: 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
ff10: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
ff20: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
ff30: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
ff40: 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
ff50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
ff60: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ff70: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ff80: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ff90: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ffa0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ffb0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
ffc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
ffd0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
ffe0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
fff0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10000 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
10010 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
10020 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
10030 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
10040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10060 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
10070 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
10080 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
10090 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
100a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
100b0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
100c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
100d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
100e0 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
100f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10100 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
10110 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
10120 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10130 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10140 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10150 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10160 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
10170 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
10180 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
10190 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
101a0 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
101b0 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
101c0 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
101d0 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
101e0 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
101f0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
10200 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
10210 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
10220 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
10230 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
10240 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
10250 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
10260 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10270 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
10280 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
10290 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
102a0 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
102b0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
102c0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
102d0 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
102e0 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
102f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
10300 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
10310 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10320 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
10330 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
10340 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
10350 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10370 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
10380 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
10390 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
103a0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
103b0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
103c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
103d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
103e0 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
103f0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
10400 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
10410 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
10420 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
10430 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
10440 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
10450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10460 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
10470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10490 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
104a0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
104b0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
104c0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
104d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
104e0 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
104f0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
10500 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10510 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10530 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
10540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
10550 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
10560 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10570 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
10580 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
10590 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
105a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
105b0 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
105c0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
105d0 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
105e0 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
105f0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
10600 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
10610 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
10620 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
10630 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10640 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
10650 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
10660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10670 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
10680 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
10690 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
106a0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
106b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
106c0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
106d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
106e0 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
106f0 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
10700 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10710 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
10720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10730 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
10740 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10750 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
10760 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
10770 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
10780 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
10790 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
107a0 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
107b0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
107c0 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
107d0 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
107e0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
107f0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
10800 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
10810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10820 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
10830 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
10840 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10860 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
10870 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
10880 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
10890 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
108a0 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
108b0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
108c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
108d0 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
108e0 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
108f0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
10900 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10910 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10920 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
10930 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10940 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
10950 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
10960 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
10970 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
10980 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10990 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
109a0 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
109b0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
109c0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
109d0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
109e0 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
109f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
10a00 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
10a10 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10a20 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
10a30 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
10a40 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
10a50 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
10a60 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
10a70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
10a80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
10a90 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
10aa0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
10ab0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
10ac0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
10ad0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10ae0 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
10af0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10b00 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
10b10 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
10b20 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
10b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10b40 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
10b50 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
10b60 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
10b70 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
10b80 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
10b90 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
10ba0 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
10bb0 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
10bc0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
10bd0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10be0 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
10bf0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10c00 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
10c10 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
10c20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
10c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
10c40 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
10c50 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
10c60 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
10c70 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
10c80 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
10c90 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
10ca0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10cb0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
10cc0 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
10cd0 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
10ce0 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
10cf0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
10d00 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
10d10 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
10d20 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
10d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10d40 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
10d50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10d60 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
10d70 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
10d80 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
10d90 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
10da0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
10db0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10dc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10dd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
10de0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10df0 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
10e00 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
10e10 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
10e20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
10e30 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
10e40 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
10e50 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
10e60 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
10e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10e80 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
10e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
10ea0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
10eb0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
10ec0 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
10ed0 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
10ee0 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
10ef0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10f00 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
10f10 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
10f20 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
10f30 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
10f40 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10f50 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  k(p, SQLITE_OK);
10f60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10f70 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
10f80 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
10f90 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
10fa0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
10fb0 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
10fc0 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
10fd0 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
10fe0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
10ff0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
11000 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
11010 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
11020 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11030 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
11040 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
11050 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
11060 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
11070 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11080 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
11090 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
110a0 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
110b0 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
110c0 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
110d0 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
110e0 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
110f0 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
11100 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
11110 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
11120 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
11130 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
11140 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
11150 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
11160 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
11170 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
11180 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
11190 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
111a0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
111b0 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
111c0 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
111d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
111e0 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
111f0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
11200 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
11210 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
11220 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
11230 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11240 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
11250 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
11260 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11270 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
11280 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
11290 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
112a0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
112b0 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
112c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
112d0 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
112e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
112f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11310 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
11320 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
11330 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64  of pages allowed
11340 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
11350 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
11360 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
11370 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f   pages is set to
11380 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a   the absolute.**
11390 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
113a0 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  .  If mxPage is 
113b0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61  negative, the pa
113c0 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72  ger will.** oper
113d0 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73  ate asynchronous
113e0 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74  ly - it will not
113f0 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e   stop to do fsyn
11400 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72  c()s.** to insur
11410 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  e data is writte
11420 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  n to the disk su
11430 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20  rface before.** 
11440 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61  continuing.  Tra
11450 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
11460 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e  work if synchron
11470 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61  ous is off,.** a
11480 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
11490 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  cannot be corrup
114a0 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67  ted if this prog
114b0 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20  ram.** crashes. 
114c0 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72   But if the oper
114d0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61  ating system cra
114e0 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73  shes or there is
114f0 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f  .** an abrupt po
11500 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e  wer failure when
11510 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
11520 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73  off, the databas
11530 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65  e.** could be le
11540 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
11550 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f  stent and unreco
11560 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a  verable state..*
11570 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  * Synchronous is
11580 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73   on by default s
11590 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
115a0 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  ption is not.** 
115b0 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79  normally a worry
115c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
115d0 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
115e0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
115f0 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
11600 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11610 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
11620 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11630 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
11640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11650 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
11660 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
11670 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11680 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
116a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
116b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
116c0 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
116d0 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
116e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
116f0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
11700 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
11710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11720 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
11730 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
11740 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
11750 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11760 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11770 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11780 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11790 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
117a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
117b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
117c0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
117d0 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
117e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
117f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11810 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11820 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11830 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11840 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11850 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11860 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11870 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11880 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11890 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
118a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
118b0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
118c0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
118d0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
118e0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
118f0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11900 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11910 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11920 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11930 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11940 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11950 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11960 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11970 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11980 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11990 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
119a0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
119b0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
119c0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
119d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
119e0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
119f0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11a00 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11a10 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11a30 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11a40 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11a50 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11a60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11a70 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
11a80 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
11a90 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
11aa0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
11ab0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
11ac0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
11ad0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
11ae0 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
11af0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11b00 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11b10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11b20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11b30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11b40 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11b50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11b60 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11b70 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
11b80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11b90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11ba0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
11bb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
11bc0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
11bd0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
11be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11c00 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11c20 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11c30 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11c40 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11c50 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11c60 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11c70 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11c80 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11c90 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
11ca0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
11cb0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
11cc0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11cd0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11ce0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11cf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11d00 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11d10 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11d20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11d30 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11d40 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11d60 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11d70 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11d80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11db0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
11dc0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
11dd0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
11de0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
11df0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11e00 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11e10 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11e30 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11e40 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11e50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11e60 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11e70 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
11e80 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
11e90 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
11ea0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
11eb0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
11ec0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
11ed0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
11ee0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
11ef0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11f00 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11f10 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11f20 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11f30 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11f40 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11f50 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11f60 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11f70 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11f80 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11f90 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
11fa0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
11fb0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
11fc0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
11fd0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
11fe0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
11ff0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
12000 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
12010 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
12020 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
12030 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
12040 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
12050 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
12060 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
12070 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
12080 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
12090 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
120a0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
120b0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
120c0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
120d0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
120e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
120f0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
12100 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
12110 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
12120 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
12130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12140 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12150 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
12160 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
12170 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
12180 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
12190 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
121a0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
121b0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
121c0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
121d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
121e0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
121f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12200 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
12210 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
12220 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
12230 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
12240 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
12250 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
12260 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
12270 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
12280 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
12290 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
122a0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
122b0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
122c0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
122d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
122e0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
122f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12300 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
12310 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
12320 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
12330 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
12340 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
12350 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
12360 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
12370 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12380 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12390 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
123a0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
123b0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
123c0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
123d0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
123e0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
123f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
12400 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
12410 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12420 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12440 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
12450 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
12460 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
12470 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
12480 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
12490 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
124a0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
124b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
124c0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
124d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
124e0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
124f0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
12500 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12510 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
12520 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
12530 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
12540 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
12550 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
12560 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
12570 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
12580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
12590 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
125a0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
125b0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
125c0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
125d0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
125e0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
125f0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12600 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12610 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12620 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12630 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12640 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12650 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12660 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12670 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12680 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12690 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
126a0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
126b0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
126c0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
126d0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
126e0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
126f0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12700 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
12710 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12720 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12730 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
12740 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  ;.  return p->pB
12750 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12760 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12770 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12780 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c  LITE_HAS_CODEC |
12790 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  | SQLITE_DEBUG *
127a0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
127b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
127c0 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
127d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
127e0 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
127f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12800 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
12810 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12820 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12830 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12840 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12850 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12860 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12870 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12880 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12890 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
128a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
128b0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
128c0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
128d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
128e0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
128f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12900 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12920 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12930 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12940 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12950 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
12960 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
12970 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
12980 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
12990 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
129a0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
129b0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
129c0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
129d0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
129e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
129f0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12a00 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
12a10 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
12a20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12a30 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
12a40 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12a50 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
12a60 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
12a70 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
12a80 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12a90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12aa0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12ab0 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
12ac0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
12ad0 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
12ae0 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
12af0 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
12b00 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
12b10 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
12b20 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12b30 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
12b40 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
12b50 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
12b60 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12b70 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
12b80 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
12b90 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
12ba0 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
12bb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
12bc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12bd0 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
12be0 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
12bf0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
12c00 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
12c10 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
12c20 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
12c30 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
12c40 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
12c50 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
12c60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12c70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
12c80 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12c90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12ca0 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
12cb0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
12cc0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
12cd0 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
12ce0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12cf0 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
12d00 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
12d10 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12d20 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
12d30 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
12d40 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
12d50 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
12d60 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
12d70 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
12d80 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
12d90 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
12da0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
12db0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
12dc0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
12dd0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
12de0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
12df0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
12e00 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
12e10 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
12e20 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
12e30 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
12e40 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
12e50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12e60 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
12e70 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
12e80 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
12e90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12ea0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12eb0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
12ec0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
12ed0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ee0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
12ef0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12f00 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
12f10 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
12f20 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12f30 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12f40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
12f60 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
12f70 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
12f80 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12f90 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
12fa0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12fb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12fc0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12fd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12fe0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12ff0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
13000 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
13010 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
13020 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
13030 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
13040 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
13050 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
13060 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
13070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13080 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
13090 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
130a0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
130b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
130c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
130d0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
130e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
130f0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13100 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
13110 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
13120 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13130 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
13140 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
13150 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
13160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
13180 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
13190 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
131a0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
131b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
131c0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
131d0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
131e0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
131f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
13200 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
13210 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
13220 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
13230 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
13240 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
13250 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
13260 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
13270 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
13280 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
13290 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
132a0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
132b0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
132c0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
132d0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
132e0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
132f0 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
13300 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
13310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13320 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
13330 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
13340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
13350 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
13360 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13370 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
13380 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
13390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
133a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
133b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
133c0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
133d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
133e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
133f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13400 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
13410 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13420 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13430 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
13440 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
13450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13460 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13480 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
13490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
134a0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
134b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
134c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
134d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
134e0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
134f0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13500 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
13510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
13520 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
13530 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
13540 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
13550 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
13560 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
13570 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
13580 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
13590 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
135a0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
135b0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
135c0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
135d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
135e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
135f0 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
13600 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
13610 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
13620 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
13630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
13640 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
13650 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
13660 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
13670 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
13680 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
13690 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
136a0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
136b0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
136c0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
136d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
136e0 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
136f0 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
13700 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13710 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13720 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13730 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
13740 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
13750 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
13760 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
13770 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
13780 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
13790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
137a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
137b0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
137c0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
137d0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
137e0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
137f0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
13800 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13810 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
13820 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13830 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
13840 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
13850 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
13860 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
13870 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
13880 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
13890 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
138a0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
138b0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
138c0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
138d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
138e0 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
138f0 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
13900 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
13910 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
13920 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
13930 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
13940 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
13950 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
13960 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
13970 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
13980 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
13990 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
139a0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
139b0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
139c0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
139d0 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
139e0 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
139f0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
13a00 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13a10 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
13a20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
13a30 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
13a40 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
13a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13a60 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
13a70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
13a80 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
13a90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13aa0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13ab0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13ac0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
13ad0 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
13ae0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13af0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13b00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
13b20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13b30 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
13b40 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13b50 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
13b60 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
13b70 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
13b80 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
13b90 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13ba0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13bb0 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13bc0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13bd0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13be0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13bf0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13c00 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13c10 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
13c20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
13c30 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
13c40 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
13c50 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
13c60 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
13c70 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
13c80 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
13c90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13ca0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13cb0 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13cc0 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13cd0 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13ce0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13cf0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13d00 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13d10 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
13d20 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
13d30 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
13d40 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
13d50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13d60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
13d80 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13d90 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13da0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13db0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13dc0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13dd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13de0 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13df0 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13e00 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13e10 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
13e20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
13e30 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
13e40 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
13e50 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
13e60 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
13e70 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
13e80 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
13e90 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13ea0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13eb0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13ec0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13ee0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13ef0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13f00 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13f10 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
13f20 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
13f30 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
13f40 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13f50 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
13f60 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
13f70 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
13f80 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13f90 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13fa0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13fc0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13fd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13fe0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
14020 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
14030 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14040 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
14050 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
14060 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
14070 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
14080 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
14090 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
140a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
140b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
140c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
140d0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
140e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
140f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14110 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
14120 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
14130 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
14140 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
14150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14160 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
14170 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
14180 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
14190 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
141a0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
141b0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
141c0 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
141d0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
141e0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
141f0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
14200 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
14210 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
14220 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
14230 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
14240 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
14250 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
14260 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
14270 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
14280 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
14290 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
142a0 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
142b0 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
142c0 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
142d0 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
142e0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
142f0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
14300 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
14310 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
14320 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
14330 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
14340 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
14350 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
14360 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
14370 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
14380 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
14390 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
143a0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
143b0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
143c0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
143d0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
143e0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
143f0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
14400 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
14410 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
14420 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
14430 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
14440 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14450 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
14460 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
14470 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
14480 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14490 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
144a0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
144b0 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
144c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
144d0 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
144e0 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
144f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14500 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
14510 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
14520 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
14530 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
14540 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
14550 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
14560 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
14570 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
14580 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14590 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
145a0 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
145b0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
145c0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
145d0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
145e0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
145f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
14600 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
14610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14620 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
14630 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
14640 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14650 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
14660 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14670 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
14680 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
14690 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
146a0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
146b0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
146c0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
146d0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
146e0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
146f0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
14700 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
14710 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
14720 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
14730 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
14740 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
14750 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
14760 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
14770 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
14780 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
14790 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
147a0 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
147b0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
147c0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75  the databse.  Cu
147d0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
147e0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
147f0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
14800 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
14810 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
14820 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
14830 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
14840 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
14850 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
14860 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
14870 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
14880 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
14890 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
148a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
148b0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
148c0 70 43 75 72 2d 3e 77 72 46 6c 61 67 29 20 26 26  pCur->wrFlag) &&
148d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
148e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
148f0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
14900 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
14910 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
14920 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
14930 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
14940 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
14950 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
14960 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
14970 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
14980 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14990 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
149a0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
149b0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
149c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
149d0 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
149e0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
149f0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
14a00 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
14a10 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
14a20 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
14a30 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
14a40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14a50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
14a60 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14a70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14a90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14aa0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
14ab0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
14ac0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
14ad0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
14ae0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
14af0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
14b00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
14b10 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
14b20 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
14b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14b40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
14b50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14b60 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
14b70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
14b80 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
14b90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
14ba0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
14bb0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
14bc0 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
14bd0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
14be0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
14bf0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
14c00 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
14c10 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
14c20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
14c30 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
14c40 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
14c50 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
14c60 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
14c70 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
14c80 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
14c90 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14ca0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
14cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14cc0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
14cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14ce0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14cf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
14d00 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
14d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14d30 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
14d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
14d50 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
14d60 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
14d70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
14d80 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
14d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
14da0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
14db0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
14dc0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
14dd0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
14de0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
14df0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
14e00 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
14e10 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
14e20 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
14e30 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
14e40 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14e50 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
14e60 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
14e70 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
14e80 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
14e90 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
14ea0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
14eb0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
14ec0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
14ed0 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
14ee0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
14ef0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
14f00 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
14f10 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
14f20 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
14f30 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
14f40 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
14f50 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
14f60 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
14f70 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
14f80 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
14f90 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
14fa0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
14fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14fc0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14fd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
14fe0 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
14ff0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
15000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15010 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
15020 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
15030 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
15040 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
15050 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
15060 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
15070 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
15080 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
15090 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
150a0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
150b0 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
150c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
150d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
150e0 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
150f0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
15100 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
15110 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
15120 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
15130 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
15140 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
15150 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
15160 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
15170 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
15180 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
15190 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
151a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
151b0 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
151c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
151d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
151e0 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
151f0 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
15200 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
15210 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
15220 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15240 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
15250 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
15260 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
15270 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
15280 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
15290 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
152a0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
152b0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
152c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
152d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
152e0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
152f0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
15300 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
15310 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
15320 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
15330 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
15340 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
15350 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
15360 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
15370 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
15380 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
15390 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
153a0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
153b0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
153c0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
153d0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
153e0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
153f0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
15400 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
15410 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15420 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
15430 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
15440 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
15450 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
15460 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
15470 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
15480 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
15490 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
154a0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
154b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
154c0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
154d0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
154e0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
154f0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
15500 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
15510 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
15520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
15530 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
15540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
15550 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
15560 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
15570 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15580 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
15590 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
155a0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
155b0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
155c0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
155d0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
155e0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
155f0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
15600 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
15610 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
15620 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
15630 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
15640 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
15650 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
15660 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
15670 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
15680 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
15690 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
156a0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
156b0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
156c0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
156d0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
156e0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
156f0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
15700 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
15710 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
15720 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
15730 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
15740 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
15750 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
15760 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
15770 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
15780 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
15790 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
157a0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
157b0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
157c0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
157d0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
157e0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
157f0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
15800 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
15810 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
15820 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
15830 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
15840 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
15850 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
15860 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
15870 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
15880 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
15890 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
158a0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
158b0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
158c0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
158d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
158e0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
158f0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
15900 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
15910 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
15920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15930 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15950 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15960 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
15970 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
15980 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
15990 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
159a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
159b0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
159c0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
159d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
159e0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
159f0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
15a00 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
15a10 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
15a20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15a30 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
15a40 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15a50 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
15a60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
15a70 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
15a80 20 61 73 73 65 72 74 28 20 49 66 4e 6f 74 4f 6d   assert( IfNotOm
15a90 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
15aa0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
15ab0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
15ac0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
15ad0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
15ae0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
15af0 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15b00 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15b10 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15b20 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15b30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15b40 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15b50 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15b70 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15b80 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
15b90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
15ba0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
15bb0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
15bc0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
15bd0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
15be0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
15bf0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15c00 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15c10 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15c20 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15c40 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15c50 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15c60 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15c70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15c80 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
15c90 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
15ca0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
15cb0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
15cc0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
15cd0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
15ce0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
15cf0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15d00 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15d10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15d20 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15d30 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15d40 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15d50 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15d70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
15d80 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
15d90 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
15da0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
15db0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
15dc0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
15dd0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
15de0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
15df0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15e00 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
15e10 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
15e20 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
15e30 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
15e40 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
15e50 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
15e60 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
15e70 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
15e80 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
15e90 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
15ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
15eb0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
15ec0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
15ed0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
15ee0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
15ef0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
15f00 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
15f10 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
15f20 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
15f30 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
15f40 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
15f50 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15f60 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
15f70 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
15f80 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
15f90 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
15fa0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
15fb0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
15fc0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
15fd0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
15fe0 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
15ff0 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
16000 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
16010 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
16020 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
16030 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
16040 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
16050 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
16060 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
16070 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
16080 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
16090 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
160a0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
160b0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
160c0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
160d0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
160e0 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
160f0 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
16100 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
16110 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
16120 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
16130 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
16140 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
16150 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
16160 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
16170 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16180 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
16190 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
161a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
161b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
161c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
161d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
161e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
161f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16200 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
16210 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
16220 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
16230 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
16240 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16260 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
16270 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
16280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16290 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
162a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
162b0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
162c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
162d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
162e0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
162f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
16300 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16310 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
16320 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
16330 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
16340 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
16350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16360 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
16370 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
16380 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
16390 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
163a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
163c0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
163d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
163e0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
163f0 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
16400 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
16410 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
16420 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
16430 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
16440 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
16450 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
16460 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
16470 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
16480 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
16490 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
164a0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
164b0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
164c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
164d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
164e0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
164f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16500 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
16510 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
16520 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
16530 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
16540 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
16550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16560 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
16570 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
16580 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
16590 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
165a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
165b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
165c0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
165d0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
165e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
165f0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
16600 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
16610 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
16620 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
16630 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
16640 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
16650 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
16660 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
16670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16680 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
16690 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
166a0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
166b0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
166c0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
166d0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
166e0 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
166f0 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
16700 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
16710 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
16720 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
16730 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
16740 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
16750 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
16760 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
16770 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
16780 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
16790 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
167a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
167b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
167c0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
167d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
167e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
167f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16800 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
16810 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
16820 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16840 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
16850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16860 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
16870 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
16880 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
16890 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
168a0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
168b0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
168c0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
168d0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
168e0 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
168f0 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
16900 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
16910 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
16920 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
16930 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
16940 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
16950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16960 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
16970 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
16980 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
16990 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
169a0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
169b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
169c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
169d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
169e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
169f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
16a00 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
16a10 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
16a20 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
16a30 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
16a40 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
16a50 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
16a60 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
16a70 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
16a80 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
16a90 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
16aa0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
16ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16ac0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
16ad0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
16ae0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
16b10 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
16b20 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
16b50 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
16b60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16b90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
16ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
16bb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
16bc0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
16bd0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
16be0 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
16bf0 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
16c00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16c10 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
16c20 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
16c30 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
16c40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
16c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16c60 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
16c70 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
16c80 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
16c90 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
16ca0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
16cb0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
16cc0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
16cd0 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
16ce0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
16cf0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
16d00 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
16d10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16d20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
16d30 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
16d40 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
16d50 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16d60 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16d70 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
16d80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
16d90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16da0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
16db0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
16dc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16dd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
16de0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
16df0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
16e00 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
16e10 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
16e20 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
16e30 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
16e40 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
16e50 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
16e60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
16e70 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
16e80 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
16e90 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
16ea0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
16eb0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
16ec0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
16ed0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
16ee0 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
16ef0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
16f00 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
16f10 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
16f20 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
16f30 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
16f40 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16f50 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
16f60 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
16f70 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
16f80 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
16f90 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
16fa0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
16fb0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
16fc0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
16fd0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
17000 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
17010 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
17020 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17030 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
17040 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
17050 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17060 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
17070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17080 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
17090 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
170a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
170b0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
170c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
170d0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
170e0 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
170f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17100 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
17110 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
17120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17130 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
17140 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
17150 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
17160 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17170 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
17180 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
17190 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
171a0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
171b0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
171c0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
171d0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
171e0 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
171f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
17220 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17230 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
17240 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
17250 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
17260 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
17270 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
17280 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
17290 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
172a0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
172b0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
172c0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
172d0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
172e0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
172f0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
17300 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17310 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
17320 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
17330 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
17340 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
17350 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
17360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17370 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
17380 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
17390 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
173a0 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
173b0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
173c0 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
173d0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
173e0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
173f0 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
17400 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
17410 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17420 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
17430 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
17460 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
17470 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
17480 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17490 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
174a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
174b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
174c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
174d0 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
174e0 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
174f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
17500 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
17510 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17520 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17530 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
17540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17560 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
17570 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17580 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
17590 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
175a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
175b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
175c0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
175d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
175e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
175f0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
17600 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
17610 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
17620 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
17630 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
17640 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
17650 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
17660 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
17670 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
17680 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
17690 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
176a0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
176b0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
176c0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
176d0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
176e0 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
176f0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
17700 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
17710 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
17720 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
17730 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
17740 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
17750 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
17760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17770 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
17780 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
17790 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
177a0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
177b0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
177c0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
177d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
177e0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
177f0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
17800 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
17810 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
17820 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
17830 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
17840 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17850 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
17860 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
17870 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
17880 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
17890 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
178a0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
178b0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
178c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
178d0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
178e0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
178f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
17900 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
17910 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
17920 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
17930 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
17940 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
17950 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
17960 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
17970 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
17980 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17990 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
179a0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
179b0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
179c0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
179d0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
179e0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
179f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17a00 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
17a20 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
17a30 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
17a40 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
17a50 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
17a60 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
17a70 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
17a80 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
17a90 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
17aa0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
17ab0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
17ac0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
17ad0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17ae0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
17af0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
17b00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17b10 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
17b20 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
17b30 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
17b40 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
17b50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17b70 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
17b80 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
17b90 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
17ba0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
17bb0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
17bc0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
17bd0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
17be0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
17bf0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
17c00 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
17c10 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
17c20 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
17c30 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
17c40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
17c50 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
17c60 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
17c70 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
17c80 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
17c90 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
17ca0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
17cb0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
17cc0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
17cd0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
17ce0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
17cf0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
17d00 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
17d10 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
17d20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
17d30 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
17d40 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
17d50 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
17d60 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
17d70 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
17d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
17db0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
17dc0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
17dd0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
17de0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
17df0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
17e00 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17e10 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
17e20 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
17e30 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
17e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17e70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17e80 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
17e90 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
17ea0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
17eb0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
17ec0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
17ed0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
17ee0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
17ef0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
17f00 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
17f10 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
17f20 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
17f30 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
17f40 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
17f50 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
17f60 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
17f70 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
17f80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17fc0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
17fd0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
17fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17ff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18000 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
18010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18020 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
18030 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
18040 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
18050 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
18060 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
18070 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
18080 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
180a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
180b0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
180c0 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
180d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
180e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
180f0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
18100 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
18110 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
18120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
18130 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
18140 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
18150 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
18160 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
18170 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
18180 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
18190 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
181a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
181b0 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
181c0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
181d0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
181e0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
181f0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
18200 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
18210 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
18220 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
18230 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
18240 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
18250 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
18260 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
18270 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
18280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18290 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
182a0 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
182b0 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
182c0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
182d0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
182e0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
182f0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
18300 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
18310 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
18320 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
18330 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
18340 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
18350 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
18360 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
18370 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
18380 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
18390 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
183a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
183b0 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
183c0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
183d0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
183e0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
183f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
18400 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
18410 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
18420 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
18430 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
18440 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
18450 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
18460 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
18470 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
18480 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
18490 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
184a0 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
184b0 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
184c0 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
184d0 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
184e0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
184f0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
18500 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18510 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
18520 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
18530 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
18540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18550 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18560 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18570 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
18580 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
18590 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
185a0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
185b0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
185c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
185d0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
185e0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
185f0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
18600 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
18610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18620 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
18630 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
18640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
18650 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
18660 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
18670 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
18680 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
18690 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
186a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
186c0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
186d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
186e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
186f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18700 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18710 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18720 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
18730 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
18740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
18750 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
18760 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
18770 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
18780 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
18790 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
187a0 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
187b0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
187c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
187d0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
187e0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
187f0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
18800 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
18810 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
18820 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
18830 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
18840 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
18850 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
18860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18870 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
18880 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
18890 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
188a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
188b0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
188c0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
188d0 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
188e0 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
188f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
18930 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
18940 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
18950 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
18960 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
18970 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
18980 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
18990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
189a0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
189b0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
189c0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
189d0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
189e0 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
189f0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
18a00 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
18a10 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
18a20 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
18a30 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
18a40 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
18a50 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
18a60 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
18a70 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
18a80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
18a90 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
18aa0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 2c 20  g, &pLastPg, 0, 
18ab0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
18ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18af0 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
18b00 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
18b10 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
18b20 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
18b30 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
18b40 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
18b50 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
18b60 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
18b70 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
18b80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
18b90 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
18ba0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
18bb0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
18bc0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
18bd0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
18be0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
18bf0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
18c00 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
18c10 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
18c20 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
18c30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18c40 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
18c50 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
18c60 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
18c70 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
18c80 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
18c90 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
18ca0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
18cb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18cc0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18cd0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
18ce0 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
18cf0 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
18d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18d20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
18d30 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
18d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
18d60 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18d70 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
18d80 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
18d90 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
18da0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
18db0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
18dc0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
18dd0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
18de0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
18df0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
18e00 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
18e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18e20 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
18e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18e50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18e70 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
18e80 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
18e90 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
18ea0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
18eb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18ec0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
18ed0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18ee0 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
18ef0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
18f00 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
18f10 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
18f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
18f40 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
18f50 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
18f60 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
18f70 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
18f80 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
18f90 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
18fa0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
18fb0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
18fc0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
18fd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18fe0 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
18ff0 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
19000 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
19010 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
19020 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
19030 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
19040 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
19050 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19080 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
19090 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
190a0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
190d0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
190e0 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
190f0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
19100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19110 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
19120 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
19130 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
19140 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
19150 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
19160 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
19170 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
19180 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
19190 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
191a0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
191b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
191c0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
191d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
191e0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
191f0 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
19200 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19210 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
19220 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
19230 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
19240 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
19250 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
19260 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
19270 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
19280 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
19290 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
192a0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
192b0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
192c0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
192d0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
192e0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
192f0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
19300 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
19310 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
19320 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
19330 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
19340 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
19350 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
19360 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
19370 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
19380 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19390 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
193a0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
193b0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
193c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
193d0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
193e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
193f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19400 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
19410 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19420 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19430 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19440 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
19450 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19460 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
19470 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19480 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19490 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
194a0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
194b0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
194c0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
194d0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
194e0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
194f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
19500 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
19510 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
19520 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
19530 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
19540 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19550 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19560 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
19570 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
19580 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
19590 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
195a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
195b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
195c0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
195d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
195e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
195f0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
19600 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
19610 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19650 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19660 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19670 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19680 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
19690 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
196a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
196b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
196c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
196d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
196e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
196f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19700 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19710 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19720 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
19730 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
19740 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
19750 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
19760 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
19770 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
19780 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
19790 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
197a0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
197b0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
197c0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
197d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
197e0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
197f0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
19800 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
19810 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
19820 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
19830 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
19840 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
19850 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
19860 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
19870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
19880 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
19890 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
198a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
198b0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
198c0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
198d0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
198e0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
198f0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19900 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
19910 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19920 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19930 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
19940 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
19950 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
19960 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
19970 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
19980 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
19990 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
199a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
199b0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
199c0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
199d0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
199e0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
199f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19a00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
19a10 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
19a20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
19a30 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
19a40 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
19a50 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
19a60 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
19a70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
19a80 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
19a90 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
19aa0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
19ab0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
19ac0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19ad0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
19ae0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19af0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19b00 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
19b10 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
19b20 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
19b30 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
19b40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
19b50 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
19b60 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
19b70 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
19b80 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
19b90 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
19ba0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
19bb0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
19bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19be0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19bf0 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
19c00 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
19c10 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
19c20 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
19c30 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
19c40 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
19c50 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
19c60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19c70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19c80 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
19c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
19ca0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
19cb0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
19cc0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
19cd0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
19ce0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
19cf0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
19d00 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
19d10 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
19d20 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
19d30 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
19d40 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
19d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
19d60 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
19d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19d80 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19d90 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19da0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19db0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19dc0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
19dd0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
19de0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19df0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
19e00 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19e10 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
19e20 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
19e30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
19e40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
19e50 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
19e60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19e80 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19e90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19ea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
19eb0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
19ec0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
19ed0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
19ee0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
19ef0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
19f00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
19f10 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
19f20 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
19f30 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
19f40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19f50 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
19f60 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
19f70 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
19f80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
19f90 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
19fa0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
19fb0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
19fc0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
19fd0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
19fe0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
19ff0 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1a000 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1a010 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1a020 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1a030 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1a040 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1a050 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1a060 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1a070 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1a080 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a090 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1a0a0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1a0b0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1a0c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1a0d0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1a0e0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1a0f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1a100 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a120 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1a130 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1a140 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1a150 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1a160 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1a170 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1a180 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1a190 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1a1a0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1a1b0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1a1c0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1a1d0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1a1e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1a1f0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1a200 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1a210 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1a220 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1a230 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1a240 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1a250 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1a260 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1a270 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1a280 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1a290 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1a2a0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1a2b0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1a2c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1a2d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a2e0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1a2f0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a300 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1a310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1a320 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1a330 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1a340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1a350 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1a360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1a370 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1a380 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1a390 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1a3a0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1a3b0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1a3c0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1a3d0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1a3e0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1a3f0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1a400 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1a410 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1a420 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1a430 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1a440 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1a450 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1a460 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1a470 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1a480 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1a490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a4a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1a4b0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1a4c0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1a4d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a4e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1a4f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a500 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1a510 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a520 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1a530 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1a540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a550 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a560 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1a570 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1a580 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1a590 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1a5a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a5b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1a5c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a5d0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1a5e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1a5f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1a600 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1a610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a620 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1a630 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1a640 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1a650 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1a660 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a670 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1a680 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1a690 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a6a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a6b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a6d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1a6e0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1a6f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1a700 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1a710 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1a720 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1a730 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1a740 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1a750 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1a760 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1a770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a780 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1a790 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1a7a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1a7b0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1a7c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1a7d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a7e0 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1a7f0 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1a800 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1a810 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1a820 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
1a830 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1a840 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1a850 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1a860 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1a870 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1a880 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1a890 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1a8a0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1a8b0 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1a8c0 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1a8d0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1a8e0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1a8f0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1a900 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1a910 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1a920 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1a930 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1a940 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1a950 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1a960 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1a970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1a980 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1a990 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1a9a0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1a9b0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1a9c0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1a9d0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1a9e0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1a9f0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1aa00 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1aa10 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1aa20 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1aa30 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1aa40 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1aa50 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1aa60 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1aa70 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1aa80 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1aa90 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1aaa0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1aab0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1aac0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1aad0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1aae0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1aaf0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1ab00 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1ab10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1ab20 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1ab30 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1ab40 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1ab50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1ab60 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1ab70 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1ab80 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1ab90 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1aba0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1abb0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1abc0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1abd0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1abe0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1abf0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1ac00 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1ac10 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1ac20 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1ac30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ac40 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1ac50 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1ac60 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1ac70 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1ac80 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ac90 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1aca0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1acb0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1acc0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1acd0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1ace0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1acf0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1ad00 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ad10 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1ad20 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1ad30 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1ad40 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1ad50 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1ad60 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1ad70 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1ad80 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1ad90 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1ada0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1adb0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1adc0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1add0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1ade0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1adf0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ae00 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1ae10 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1ae20 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1ae30 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1ae40 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1ae50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1ae60 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1ae70 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1ae80 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1ae90 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1aea0 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1aeb0 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1aec0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1aed0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1aee0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1aef0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1af00 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1af10 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1af20 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1af30 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1af40 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1af50 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1af60 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1af70 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1af80 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1af90 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1afa0 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1afb0 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1afc0 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1afd0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1afe0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1aff0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1b000 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1b010 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1b020 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b030 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1b040 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1b050 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1b060 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1b070 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1b080 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1b090 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1b0a0 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1b0b0 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1b0c0 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1b0d0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1b0e0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1b0f0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1b100 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1b110 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1b120 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b130 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1b140 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1b150 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1b160 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1b170 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1b180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1b190 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1b1a0 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1b1b0 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1b1c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1b1d0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1b1e0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1b1f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b200 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1b210 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1b220 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1b230 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b240 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1b250 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1b260 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1b270 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1b280 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1b290 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1b2a0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b2b0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1b2c0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b2d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b2e0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1b2f0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b300 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b310 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1b320 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1b330 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1b340 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1b350 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1b360 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1b370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b380 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1b390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b3a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b3c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1b3d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b3e0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1b3f0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1b400 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1b410 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1b420 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1b430 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b440 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b450 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1b460 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1b470 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1b480 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1b490 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1b4a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1b4b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1b4c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b4d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b4e0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1b4f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b500 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1b510 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b520 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1b530 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b540 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b550 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1b560 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1b570 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1b580 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1b590 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1b5a0 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1b5b0 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1b5c0 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1b5d0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1b5e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
1b5f0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
1b600 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1b610 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
1b620 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
1b630 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b640 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1b650 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
1b660 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1b670 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1b680 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1b690 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1b6a0 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
1b6b0 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
1b6c0 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
1b6d0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
1b6e0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
1b6f0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
1b700 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
1b710 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
1b720 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
1b730 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1b740 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
1b750 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
1b760 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
1b770 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
1b780 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
1b790 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
1b7a0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
1b7b0 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
1b7c0 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1b7d0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1b7e0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1b7f0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1b800 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
1b810 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
1b820 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1b830 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b840 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1b850 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1b860 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1b870 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1b880 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1b890 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1b8a0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1b8b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1b8c0 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1b8d0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1b8e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1b8f0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1b900 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b910 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1b920 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1b930 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1b940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b950 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1b960 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1b970 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b980 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1b990 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1b9a0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1b9b0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1b9c0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1b9d0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1b9e0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1b9f0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1ba00 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1ba10 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1ba20 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1ba30 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1ba40 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1ba50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ba60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1ba70 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1ba80 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1ba90 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1baa0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1bab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1bac0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1bad0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1bae0 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  de){.  int rc;. 
1baf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1bb00 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1bb10 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1bb20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bb30 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1bb40 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1bb50 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1bb60 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1bb70 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1bb80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1bb90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bba0 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
1bbb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1bbc0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1bbd0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b  rs(p, tripCode);
1bbe0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1bbf0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1bc00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1bc10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1bc20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1bc30 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1bc40 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1bc50 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1bc60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1bc70 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1bc80 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1bc90 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1bca0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1bcb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1bcc0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1bcd0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1bce0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1bcf0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1bd00 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1bd10 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1bd20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1bd30 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1bd40 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1bd50 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1bd60 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1bd70 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1bd80 31 2c 20 30 2c 20 30 29 3d 3d 53 51 4c 49 54 45  1, 0, 0)==SQLITE
1bd90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
1bda0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
1bdb0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
1bdc0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
1bdd0 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
1bde0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1bdf0 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
1be00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1be10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
1be20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
1be30 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
1be40 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
1be50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1be60 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
1be70 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
1be80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1be90 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1bea0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
1beb0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
1bec0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1bed0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1bee0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1bef0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1bf00 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1bf10 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1bf20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1bf30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf40 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
1bf50 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
1bf60 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1bf70 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e  nsaction can can
1bf80 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
1bf90 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
1bfa0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
1bfb0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
1bfc0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
1bfd0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
1bfe0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
1bff0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1c000 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1c010 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
1c020 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
1c030 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1c040 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
1c050 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
1c060 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
1c070 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
1c080 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
1c090 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
1c0a0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
1c0b0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
1c0c0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
1c0d0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
1c0e0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
1c0f0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
1c100 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
1c110 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
1c120 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
1c130 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
1c140 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
1c150 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
1c160 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
1c170 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1c180 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
1c190 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
1c1a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
1c1b0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1c1c0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
1c1d0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
1c1e0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1c1f0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
1c200 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
1c210 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
1c220 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
1c230 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
1c240 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
1c250 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
1c260 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1c270 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
1c280 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
1c290 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
1c2a0 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
1c2b0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
1c2c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1c2d0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
1c2e0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
1c2f0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
1c300 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
1c310 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
1c320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c330 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
1c340 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
1c350 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
1c360 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1c370 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1c380 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c390 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1c3a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c3b0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1c3c0 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
1c3d0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1c3e0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
1c3f0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
1c400 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1c410 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
1c420 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
1c430 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1c440 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c450 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
1c460 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
1c470 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
1c480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1c490 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
1c4a0 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
1c4b0 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
1c4c0 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
1c4d0 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
1c4e0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
1c4f0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
1c500 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
1c510 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1c520 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
1c530 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
1c540 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
1c550 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
1c560 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1c570 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1c580 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1c590 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1c5a0 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
1c5b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1c5c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1c5d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c5e0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1c5f0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
1c600 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
1c610 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
1c620 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
1c630 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
1c640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
1c650 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
1c660 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
1c670 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
1c680 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
1c690 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
1c6a0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
1c6b0 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
1c6c0 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
1c6d0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
1c6e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1c6f0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
1c700 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
1c710 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
1c720 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
1c730 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
1c740 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
1c750 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
1c760 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
1c770 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1c780 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
1c790 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
1c7a0 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
1c7b0 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
1c7c0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
1c7d0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
1c7e0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
1c7f0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
1c800 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
1c810 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
1c820 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
1c830 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
1c840 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
1c850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c860 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
1c870 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c880 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1c890 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c8a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
1c8b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
1c8c0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
1c8d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
1c8e0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
1c8f0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
1c900 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
1c910 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1c920 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
1c930 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c940 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
1c950 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
1c960 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1c970 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
1c980 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c9a0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
1c9b0 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
1c9c0 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
1c9d0 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
1c9e0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
1c9f0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
1ca00 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
1ca10 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1ca20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1ca30 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
1ca40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ca50 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
1ca60 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ca70 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
1ca80 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
1ca90 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
1caa0 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
1cab0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
1cac0 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
1cad0 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
1cae0 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
1caf0 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
1cb00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1cb10 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
1cb20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1cb30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1cb40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1cb50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1cb60 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
1cb70 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
1cb80 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
1cb90 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
1cba0 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
1cbb0 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
1cbc0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
1cbd0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
1cbe0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
1cbf0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
1cc00 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1cc10 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
1cc20 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
1cc30 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
1cc40 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1cc50 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
1cc60 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
1cc70 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
1cc80 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1cc90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
1cca0 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
1ccb0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
1ccc0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
1ccd0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
1cce0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
1ccf0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
1cd00 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1cd10 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
1cd20 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
1cd30 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
1cd40 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
1cd50 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
1cd60 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
1cd70 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
1cd80 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
1cd90 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
1cda0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
1cdb0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1cdc0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1cdd0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
1cde0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
1cdf0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1ce00 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
1ce10 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
1ce20 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
1ce30 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
1ce40 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
1ce50 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
1ce60 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
1ce70 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
1ce80 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
1ce90 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
1cea0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
1ceb0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
1cec0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
1ced0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
1cee0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
1cef0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
1cf00 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
1cf10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1cf20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
1cf30 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
1cf40 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
1cf50 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
1cf60 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
1cf70 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1cf80 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1cf90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
1cfa0 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
1cfb0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1cfc0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
1cfd0 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
1cfe0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
1cff0 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
1d000 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
1d010 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
1d020 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
1d030 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
1d040 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1d050 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
1d060 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
1d070 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
1d080 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
1d090 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
1d0a0 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
1d0b0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1d0c0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
1d0d0 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
1d0e0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d110 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1d120 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1d150 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1d160 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1d170 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d190 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1d1a0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1d1b0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1d1c0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1d1d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1d1e0 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
1d1f0 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
1d200 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
1d230 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
1d240 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
1d250 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d270 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
1d280 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  andle */..  asse
1d290 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1d2a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1d2b0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1d2c0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
1d2d0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
1d2e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1d2f0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
1d300 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
1d310 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
1d320 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
1d330 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
1d340 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
1d350 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
1d360 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
1d370 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
1d380 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
1d390 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
1d3a0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
1d3b0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
1d3c0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
1d3d0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
1d3e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1d3f0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
1d400 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
1d410 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1d420 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
1d430 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
1d440 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
1d450 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
1d460 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
1d470 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
1d480 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
1d490 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
1d4a0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
1d4b0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1d4c0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
1d4d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1d4e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1d4f0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
1d500 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
1d510 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c    if( NEVER(wrFl
1d520 61 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ag && (pBt->btsF
1d530 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1d540 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20  ONLY)!=0) ){.   
1d550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1d560 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
1d570 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
1d580 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1d590 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
1d5a0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d5b0 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
1d5c0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
1d5d0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
1d5e0 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
1d5f0 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
1d600 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
1d610 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
1d620 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
1d630 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
1d640 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
1d650 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1d660 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
1d670 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1d680 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
1d690 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1d6a0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
1d6b0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
1d6c0 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
1d6d0 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46  wrFlag = (u8)wrF
1d6e0 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
1d6f0 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
1d700 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
1d710 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
1d720 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1d730 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
1d740 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1d750 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
1d760 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1d770 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65  D;.  pCur->cache
1d780 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65  dRowid = 0;.  re
1d790 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d7a0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1d7b0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1d7c0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1d7f0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1d800 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1d830 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1d840 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1d850 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1d880 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1d890 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1d8a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1d8d0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1d8e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d910 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1d920 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1d930 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1d940 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1d950 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1d960 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1d970 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1d980 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1d990 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1d9a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d9b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1d9c0 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1d9d0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1d9e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1d9f0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1da00 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1da10 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1da20 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1da30 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1da40 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1da50 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1da60 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1da70 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1da80 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1da90 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1daa0 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1dab0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1dac0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1dad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1dae0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1daf0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1db00 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1db10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1db20 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1db30 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1db40 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1db50 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1db60 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1db70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1db80 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1db90 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1dba0 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1dbb0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1dbc0 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1dbd0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1dbe0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1dbf0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1dc00 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1dc10 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1dc20 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1dc30 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1dc40 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1dc50 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1dc60 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1dc70 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1dc80 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1dc90 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1dca0 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1dcb0 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1dcc0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1dcd0 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1dce0 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1dcf0 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61  cursor in the sa
1dd00 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
1dd10 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20  .** as pCur and 
1dd20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20  having the same 
1dd30 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
1dd40 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76   as pCur.  The v
1dd50 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
1dd60 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  o iRowid..**.** 
1dd70 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f  Only positive ro
1dd80 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63  wid values are c
1dd90 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20  onsidered valid 
1dda0 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a  for this cache..
1ddb0 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20  ** The cache is 
1ddc0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
1ddd0 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ero, indicating 
1dde0 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65  an invalid cache
1ddf0 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c  ..** A btree wil
1de00 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68  l work fine with
1de10 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1de20 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75  e rowids.  We ju
1de30 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63  st cannot.** cac
1de40 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  he zero or negat
1de50 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63  ive rowids, whic
1de60 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74  h means tables t
1de70 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a  hat use zero or.
1de80 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  ** negative rowi
1de90 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ds might run a l
1dea0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42  ittle slower.  B
1deb0 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ut in practice, 
1dec0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74  zero.** or negat
1ded0 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76  ive rowids are v
1dee0 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20  ery uncommon so 
1def0 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  this should not 
1df00 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
1df10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1df20 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
1df30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1df40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1df50 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73  Rowid){.  BtCurs
1df60 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1df70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  Cur->pBt->pCurso
1df80 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1df90 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  ){.    if( p->pg
1dfa0 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67  noRoot==pCur->pg
1dfb0 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68  noRoot ) p->cach
1dfc0 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  edRowid = iRowid
1dfd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1dfe0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1dff0 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a  d==iRowid );.}..
1e000 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e010 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f   cached rowid fo
1e020 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
1e030 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  or.  A negative 
1e040 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72  or zero.** retur
1e050 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1e060 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  s that the rowid
1e070 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69   cache is invali
1e080 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a  d and should be.
1e090 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  ** ignored.  If 
1e0a0 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1e0b0 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1e0c0 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20   been set, then 
1e0d0 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74  a.** zero is ret
1e0e0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  urned..*/.sqlite
1e0f0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
1e100 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77  treeGetCachedRow
1e110 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1e120 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1e130 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a  r->cachedRowid;.
1e140 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1e150 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
1e160 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1e170 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e180 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
1e190 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
1e1a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
1e1b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1e1c0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
1e1d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
1e1e0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
1e1f0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
1e200 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1e210 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
1e220 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1e230 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1e240 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1e250 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
1e260 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1e270 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
1e280 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
1e290 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
1e2a0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
1e2b0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
1e2c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
1e2d0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
1e2e0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
1e2f0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1e300 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
1e310 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1e320 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
1e330 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1e340 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1e350 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1e360 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1e370 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
1e380 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1e390 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
1e3a0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1e3b0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
1e3c0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1e3d0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1e3e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e3f0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1e400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1e420 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1e430 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1e440 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1e450 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1e460 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1e470 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1e480 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1e490 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1e4a0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1e4b0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1e4c0 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1e4d0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1e4e0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1e4f0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1e500 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1e510 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1e520 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1e530 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e540 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1e550 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1e560 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1e570 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1e580 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1e590 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1e5a0 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1e5b0 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1e5c0 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1e5d0 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1e5e0 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1e5f0 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1e600 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1e610 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1e620 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1e630 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1e640 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1e650 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1e660 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1e670 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
1e680 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
1e690 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
1e6a0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
1e6b0 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
1e6c0 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
1e6d0 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
1e6e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1e6f0 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
1e700 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
1e710 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e720 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
1e730 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
1e740 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1e750 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
1e760 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
1e770 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
1e780 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1e790 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
1e7a0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1e7b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
1e7c0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
1e7d0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
1e7e0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
1e7f0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
1e800 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
1e810 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
1e820 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
1e830 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
1e840 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
1e850 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
1e860 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
1e870 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
1e880 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
1e890 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1e8a0 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
1e8b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1e8c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1e8d0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1e8e0 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65  age;.      btree
1e8f0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1e900 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1e910 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1e920 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
1e930 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1e940 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
1e950 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1e960 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1e970 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
1e980 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
1e990 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
1e9a0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
1e9b0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
1e9c0 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
1e9d0 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
1e9e0 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
1e9f0 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
1ea40 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
1ea90 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61     \.    btreePa
1eae0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1eaf0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1eb00 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1eb10 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20  pCur->info); \. 
1eb20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1eb30 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ey = 1;         
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1eb70 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ebc0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1ebd0 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1ec20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
1ec30 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
1ec40 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
1ec50 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1ec60 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1ec70 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
1ec80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1ec90 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
1eca0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
1ecb0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
1ecc0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
1ecd0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
1ece0 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
1ecf0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
1ed00 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
1ed10 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
1ed20 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
1ed30 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1ed40 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
1ed50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1ed60 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
1ed70 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ed80 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
1ed90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eda0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
1edb0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
1edc0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1edd0 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
1ede0 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
1edf0 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
1ee00 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
1ee10 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
1ee20 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
1ee30 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1ee40 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
1ee50 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
1ee60 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1ee70 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
1ee80 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
1ee90 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
1eea0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1eeb0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
1eec0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
1eed0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1eee0 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
1eef0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1ef00 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
1ef10 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
1ef20 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1ef30 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
1ef40 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1ef50 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
1ef60 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1ef70 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
1ef80 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1ef90 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1efa0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1efb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1efc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1efd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1efe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1eff0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1f000 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f010 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
1f020 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1f030 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1f040 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1f050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
1f060 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f070 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1f080 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1f090 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f0a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
1f0b0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1f0c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f0d0 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
1f0e0 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
1f0f0 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1f100 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
1f110 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
1f120 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
1f130 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f140 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
1f150 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
1f160 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1f170 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
1f180 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
1f190 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
1f1a0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
1f1b0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
1f1c0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
1f1d0 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1f1e0 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
1f1f0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1f200 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1f210 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
1f220 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
1f230 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
1f240 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
1f250 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
1f260 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
1f270 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
1f280 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1f290 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
1f2a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1f2b0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1f2c0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1f2d0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1f2e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f2f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f300 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f310 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1f320 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1f330 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
1f340 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
1f350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
1f370 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
1f380 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
1f390 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
1f3a0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
1f3b0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
1f3c0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
1f3d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1f3e0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
1f3f0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
1f400 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
1f410 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
1f420 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
1f430 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
1f440 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
1f450 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
1f460 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
1f470 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
1f480 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
1f490 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1f4a0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
1f4b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1f4c0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
1f4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1f4e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1f4f0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1f500 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
1f510 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
1f520 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
1f530 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
1f540 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1f550 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
1f560 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
1f570 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
1f580 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
1f590 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
1f5a0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
1f5b0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
1f5c0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
1f5d0 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
1f5e0 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
1f5f0 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
1f600 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f610 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
1f620 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
1f630 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1f640 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1f650 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
1f660 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
1f670 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
1f680 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
1f690 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
1f6a0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
1f6b0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
1f6c0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
1f6d0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
1f6e0 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
1f6f0 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
1f700 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1f710 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1f720 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
1f730 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1f740 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1f750 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1f760 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1f770 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
1f780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f790 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
1f7a0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
1f7b0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1f7c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
1f7d0 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
1f7e0 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
1f7f0 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
1f800 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
1f810 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
1f820 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1f830 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
1f840 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
1f850 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1f860 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
1f870 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1f880 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f890 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1f8a0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1f8b0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
1f8c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f8d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1f8e0 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
1f8f0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1f900 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1f910 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
1f920 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
1f930 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
1f940 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
1f950 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
1f960 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1f970 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
1f980 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
1f990 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
1f9a0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
1f9b0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
1f9c0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
1f9d0 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
1f9e0 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
1f9f0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
1fa00 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
1fa10 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1fa20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1fa30 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
1fa40 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
1fa50 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
1fa60 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
1fa70 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1fa80 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
1fa90 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
1faa0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1fab0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
1fac0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1fad0 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
1fae0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1faf0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1fb00 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
1fb10 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
1fb20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1fb30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
1fb40 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1fb50 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
1fb60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
1fb70 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
1fb80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fb90 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
1fba0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1fbb0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
1fbc0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
1fbd0 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
1fbe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fbf0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1fc00 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
1fc10 26 70 50 61 67 65 2c 20 30 2c 20 28 70 70 50 61  &pPage, 0, (ppPa
1fc20 67 65 3d 3d 30 29 29 3b 0a 20 20 20 20 61 73 73  ge==0));.    ass
1fc30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1fc40 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1fc50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1fc60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc70 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1fc80 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1fc90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1fca0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1fcb0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1fcc0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1fcd0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1fce0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1fcf0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1fd00 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1fd10 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1fd20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1fd30 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1fd40 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1fd50 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1fd60 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1fd70 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1fd80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1fd90 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1fda0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1fdb0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1fdc0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1fdd0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1fde0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1fdf0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1fe00 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1fe10 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1fe20 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1fe30 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1fe40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fe50 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1fe60 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1fe70 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1fe80 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1fe90 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1fea0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1feb0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1fec0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1fed0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1fee0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1fef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff00 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1ff10 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1ff20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1ff30 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1ff40 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1ff50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ff60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1ff70 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1ff80 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1ff90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ffa0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1ffb0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffd0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1ffe0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1fff0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
20000 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
20010 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
20020 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
20030 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
20040 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
20050 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
20060 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
20070 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
20080 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
20090 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
200a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
200b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
200c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
200d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
200e0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
200f0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
20100 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
20110 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
20120 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
20130 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
20140 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
20150 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
20160 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
20170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20180 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20190 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
201a0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
201b0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
201c0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
201d0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
201e0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
201f0 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
20200 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
20210 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
20220 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
20230 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
20240 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
20250 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
20260 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
20270 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
20280 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
20290 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
202a0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
202b0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
202c0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
202d0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
202e0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
202f0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
20300 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
20310 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
20320 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
20330 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
20340 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
20350 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
20360 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
20370 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
20380 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
20390 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
203a0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
203b0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
203c0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
203d0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
203e0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
203f0 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
20400 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
20410 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
20420 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
20430 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20440 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
20450 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
20460 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
20470 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
20480 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
20490 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
204a0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
204b0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
204c0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
204d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
204e0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
204f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
20500 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
20510 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
20520 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
20530 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
20540 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
20550 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
20560 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
20570 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
20580 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
20590 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
205a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
205b0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
205c0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
205d0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
205e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
205f0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
20600 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
20610 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
20620 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
20630 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
20640 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
20650 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
20660 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
20670 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
20680 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
20690 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
206a0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
206b0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
206c0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
206d0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
206e0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
206f0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
20700 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
20710 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
20720 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
20730 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
20740 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20750 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
20760 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
20770 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
20780 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
20790 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
207a0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
207b0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
207c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
207d0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
207e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
207f0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
20800 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
20810 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20820 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20830 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
20840 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
20850 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
20860 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20870 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
20880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
20890 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
208a0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
208b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
208c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
208d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
208e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
208f0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20900 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
20910 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
20920 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20930 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20940 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
20950 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
20960 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
20970 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
20980 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
20990 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
209a0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
209b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
209c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
209d0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
209e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
209f0 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
20a00 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
20a10 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
20a20 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
20a30 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
20a40 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
20a50 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
20a60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
20a70 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
20a80 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
20a90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
20ab0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
20ac0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
20ad0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20ae0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20af0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20b00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20b10 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20b20 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20b30 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20b40 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20b50 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20b60 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
20b70 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
20b80 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
20b90 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
20ba0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
20bb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
20bc0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
20bd0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
20be0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
20bf0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
20c00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
20c10 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
20c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20c30 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
20c40 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
20c50 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
20c60 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
20c70 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
20c80 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
20c90 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
20ca0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
20cb0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
20cc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20cd0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
20ce0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20cf0 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
20d00 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
20d10 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
20d20 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
20d30 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
20d40 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
20d50 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20d60 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
20d70 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
20d80 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
20d90 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
20da0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
20db0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
20dc0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
20dd0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
20de0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
20df0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
20e00 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
20e10 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
20e20 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
20e30 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
20e40 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
20e50 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
20e60 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
20e70 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
20e80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
20e90 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
20ea0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
20eb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
20ec0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
20ed0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
20ee0 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
20ef0 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
20f00 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
20f10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
20f20 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
20f30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
20f40 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
20f50 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
20f60 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
20f70 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
20f80 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
20f90 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
20fa0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
20fb0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
20fc0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
20fd0 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
20fe0 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
20ff0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
21000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21010 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
21020 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
21030 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
21040 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
21050 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
21060 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
21070 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
21080 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
21090 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
210a0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
210b0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
210c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
210d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
210e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
210f0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
21100 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
21110 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
21120 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
21130 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
21140 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
21150 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
21160 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
21170 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
21180 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
21190 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
211a0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
211b0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
211c0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
211d0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
211e0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
211f0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
21200 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
21210 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
21220 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
21230 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
21240 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21250 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
21260 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
21270 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
21280 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
21290 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
212a0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
212b0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
212c0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
212d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
212e0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
212f0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
21300 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
21310 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
21320 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
21330 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
21340 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
21350 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
21360 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
21370 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
21380 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
21390 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
213a0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
213b0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
213c0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
213d0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
213e0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
213f0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
21400 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
21410 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
21420 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
21430 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
21440 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
21450 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
21460 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
21470 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
21480 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
21490 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
214a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
214b0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
214c0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
214d0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
214e0 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
214f0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
21500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21510 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
21520 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
21530 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
21540 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
21550 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
21560 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
21570 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
21580 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
21590 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
215a0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
215b0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
215c0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
215d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
215e0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
215f0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
21600 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
21610 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
21620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
21630 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
21640 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
21650 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
21660 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
21670 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
21680 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
21690 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
216a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
216b0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
216c0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
216d0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
216e0 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
216f0 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
21700 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
21710 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
21720 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
21730 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
21740 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
21750 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
21760 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
21770 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
21780 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
21790 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
217a0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
217b0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
217c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
217d0 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
217e0 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
217f0 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
21800 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
21810 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
21820 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
21830 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
21840 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
21850 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
21860 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
21870 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
21880 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
21890 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
218a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
218b0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
218f0 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
21900 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
21940 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
21950 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
21960 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21980 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
21990 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
219a0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
219b0 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
219c0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
219d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
219e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
219f0 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
21a20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
21a30 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
21a40 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
21a50 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
21a60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
21a70 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
21a80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21a90 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
21aa0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
21ab0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
21ac0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
21ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
21ae0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
21af0 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
21b00 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
21b10 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
21b20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21b30 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
21b40 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
21b50 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
21b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21b70 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
21b80 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
21b90 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
21ba0 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
21bb0 30 20 3f 20 50 41 47 45 52 5f 41 43 51 55 49 52  0 ? PAGER_ACQUIR
21bc0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  E_READONLY : 0).
21bd0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
21be0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
21bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21c00 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
21c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
21c20 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
21c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
21c40 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
21c50 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
21c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
21c70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
21c80 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
21c90 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
21ca0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
21cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21cc0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
21cd0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
21ce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21cf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21d00 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
21d10 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
21d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21d30 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
21d40 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
21d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21d60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21d70 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
21d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21d90 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
21da0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
21db0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
21dc0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
21dd0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
21de0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
21df0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
21e00 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
21e10 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
21e20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
21e30 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
21e40 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
21e50 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
21e60 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
21e70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
21e80 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
21e90 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
21ea0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
21eb0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
21ec0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
21ed0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
21ee0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
21ef0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
21f00 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
21f10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21f20 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
21f30 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
21f40 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
21f50 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
21f60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21f70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21f80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
21f90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
21fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21fb0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
21fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21fd0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
21fe0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21ff0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22000 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22010 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22020 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
22030 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
22040 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
22050 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
22060 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
22070 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
22080 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
22090 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
220a0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
220b0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
220c0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
220d0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
220e0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
220f0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
22100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
22110 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
22120 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
22130 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
22140 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
22150 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
22160 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
22170 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
22180 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
22190 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
221a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
221b0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
221c0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
221d0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
221e0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
221f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22200 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
22210 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
22220 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
22230 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
22240 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
22250 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
22260 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22270 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22280 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
22290 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
222a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
222b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
222c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
222d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
222e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
222f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
22300 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22310 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22320 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22330 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22340 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22350 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22360 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
22370 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22380 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
22390 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
223a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
223b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
223c0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
223d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
223e0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
223f0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
22400 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
22410 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
22420 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
22430 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
22440 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
22450 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
22460 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
22470 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
22480 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
22490 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
224a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
224b0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
224c0 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
224d0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
224e0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
224f0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
22500 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
22510 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
22520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
22530 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
22540 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
22550 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
22560 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
22570 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
22580 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
22590 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
225a0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
225b0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
225c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
225d0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
225e0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
225f0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
22600 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
22610 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
22620 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
22630 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
22640 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
22650 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
22660 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
22670 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
22680 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
22690 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
226a0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
226b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
226c0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
226d0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
226e0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
226f0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
22700 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22710 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
22720 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
22730 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
22740 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
22750 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
22760 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
22770 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
22780 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
22790 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
227a0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
227b0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
227c0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
227d0 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
227e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
227f0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
22800 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
22810 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
22820 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
22830 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
22840 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
22850 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
22860 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
22870 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
22880 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
22890 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
228a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
228b0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
228c0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
228d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
228e0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
228f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22900 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22910 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22920 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22930 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
22940 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22950 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
22960 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22970 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
22980 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45  Cell );.  if( NE
22990 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  VER(pCur->info.n
229a0 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Size==0) ){.    
229b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
229c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
229d0 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  ->iPage], pCur->
229e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
229f0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
22a00 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e         &pCur->in
22a10 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c  fo);.  }.  aPayl
22a20 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
22a30 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
22a40 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
22a50 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
22a60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
22a70 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
22a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
22a90 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
22aa0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
22ab0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
22ac0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
22ad0 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
22ae0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
22af0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
22b00 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
22b10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
22b20 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  al;.    assert( 
22b30 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a  nLocal<=nKey );.
22b40 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
22b50 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
22b60 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
22b70 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
22b80 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
22b90 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
22ba0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
22bb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
22bc0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
22bd0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
22be0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
22bf0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
22c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22c10 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
22c20 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
22c30 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
22c40 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
22c50 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
22c60 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
22c70 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
22c80 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
22c90 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
22ca0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
22cb0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
22cc0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
22cd0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
22ce0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
22cf0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
22d00 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
22d10 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
22d20 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
22d30 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
22d40 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
22d50 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
22d60 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
22d70 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
22d80 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
22d90 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
22da0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
22db0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
22dc0 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
22dd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22de0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
22df0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
22e00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22e10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22e20 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
22e30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
22e40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22e50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22e60 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
22e70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22e80 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
22e90 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
22ea0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
22eb0 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
22ec0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63  .  return p;.}.c
22ed0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
22ee0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
22ef0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22f00 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
22f10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
22f20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22f30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22f40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
22f50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
22f60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22f70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22f80 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
22f90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22fa0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
22fb0 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
22fc0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
22fd0 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
22fe0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
22ff0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
23000 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
23010 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
23020 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
23030 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
23040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23050 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
23060 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
23070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
23080 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
23090 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
230a0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
230b0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
230c0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
230d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
230e0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
230f0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
23100 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
23110 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
23120 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
23130 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
23140 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
23150 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
23160 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
23170 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
23180 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
23190 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
231a0 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
231b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
231c0 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
231d0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
231e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
231f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23200 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23210 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23220 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23240 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
23250 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
23260 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
23270 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
23280 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
23290 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
232a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
232b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
232c0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
232d0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
232e0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
232f0 65 77 50 61 67 65 2c 20 28 70 43 75 72 2d 3e 77  ewPage, (pCur->w
23300 72 46 6c 61 67 3d 3d 30 29 29 3b 0a 20 20 69 66  rFlag==0));.  if
23310 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23320 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
23330 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
23340 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
23350 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
23360 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
23370 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23380 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
23390 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
233a0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
233b0 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
233c0 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
233d0 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
233e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
233f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23400 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
23410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
23420 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  f 0./*.** Page p
23430 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
23440 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
23450 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
23460 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
23470 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
23480 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
23490 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
234a0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
234b0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
234c0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
234d0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
234e0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
234f0 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
23500 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
23510 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
23520 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
23530 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
23540 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
23550 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
23560 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
23570 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
23580 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
23590 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
235a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
235b0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
235c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
235d0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
235e0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
235f0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
23600 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
23610 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
23620 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
23630 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
23640 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
23650 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
23660 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
23670 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
23680 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
23690 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
236a0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
236b0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
236c0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
236d0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
236e0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
236f0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
23700 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
23710 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
23720 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
23730 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
23740 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
23750 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
23760 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
23770 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
23780 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
23790 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
237a0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
237b0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
237c0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
237d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
237e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
237f0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23800 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23820 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
23830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23840 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23850 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45   );..  /* UPDATE
23860 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79  : It is actually
23870 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
23880 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74  e condition test
23890 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  ed by the assert
238a0 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62  .  ** below to b
238b0 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20  e untrue if the 
238c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
238d0 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63   corrupt. This c
238e0 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a  an occur if.  **
238f0 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20   one cursor has 
23900 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50  modified page pP
23910 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65  arent while a re
23920 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73  ference to it is
23930 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61   held .  ** by a
23940 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20   second cursor. 
23950 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  Which can only h
23960 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c  appen if a singl
23970 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64  e page is linked
23980 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20  .  ** into more 
23990 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
239a0 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63  structure in a c
239b0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
239c0 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73    */.#if 0.  ass
239d0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
239e0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
239f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
23a00 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
23a10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
23a20 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
23a30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23a40 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64  ->pgno.  );.#end
23a50 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  if.  testcase( p
23a60 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23a70 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
23a80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23a90 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
23aa0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
23ab0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
23ac0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
23ad0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
23ae0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23af0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
23b00 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
23b10 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
23b20 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
23b30 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
23b40 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
23b50 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
23b60 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
23b70 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
23b80 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
23b90 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
23ba0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
23bb0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23bc0 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
23bd0 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
23be0 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
23bf0 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
23c00 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
23c10 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
23c20 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
23c30 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
23c40 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
23c50 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
23c60 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
23c70 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
23c80 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
23c90 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
23ca0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
23cb0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
23cc0 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
23cd0 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
23ce0 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
23cf0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
23d00 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
23d10 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
23d20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
23d30 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
23d40 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
23d50 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
23d60 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
23d70 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
23d80 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23d90 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
23da0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
23db0 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
23dc0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
23dd0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
23de0 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
23df0 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
23e00 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
23e10 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
23e20 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
23e30 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
23e40 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
23e50 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
23e60 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23e70 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
23e80 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
23e90 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
23ea0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
23eb0 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
23ec0 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
23ed0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
23ee0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
23ef0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
23f00 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
23f10 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
23f20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
23f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23f40 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
23f50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
23f60 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
23f70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23f80 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
23f90 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
23fa0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23fb0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
23fc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23fd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23fe0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
23ff0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
24000 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24010 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24020 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
24030 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24040 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
24050 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
24060 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
24070 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
24080 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
24090 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
240a0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
240b0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
240c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
240d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
240e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
240f0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
24100 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
24110 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
24120 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
24130 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
24140 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
24150 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24160 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
24170 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
24180 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
24190 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
241a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
241b0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
241c0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
241d0 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
241e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
241f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
24200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24210 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
24220 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
24230 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
24240 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
24250 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 20 70 43  r->apPage[0], pC
24260 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 29 3b 0a  ur->wrFlag==0);.
24270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
24290 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
242a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
242b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
242c0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
242d0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Page = 0;..    /
242e0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
242f0 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
24300 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
24310 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
24320 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  s cursor.    ** 
24330 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
24340 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
24350 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
24360 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
24370 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74  s.    ** NULL, t
24380 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
24390 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
243a0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
243b0 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a   the case,.    *
243c0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
243d0 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
243e0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
243f0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
24400 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  ]->intKey==1 || 
24410 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
24420 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
24430 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65    if( (pCur->pKe
24440 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d  yInfo==0)!=pCur-
24450 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
24460 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
24470 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24480 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
24490 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  }..  /* Assert t
244a0 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  hat the root pag
244b0 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  e is of the corr
244c0 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d  ect type. This m
244d0 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20  ust be the.  ** 
244e0 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c  case as the call
244f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
24500 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68  n that loaded th
24510 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74  e root-page (eit
24520 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  her.  ** this ca
24530 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73  ll or a previous
24540 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75   invocation) wou
24550 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
24560 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a   corruption .  *
24570 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74  * if the assumpt
24580 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
24590 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  e, and it is not
245a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
245b0 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79  e flags .  ** by
245c0 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  te to have been 
245d0 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74  modified while t
245e0 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f  his cursor is ho
245f0 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
24600 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  e.  ** to the pa
24610 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20  ge.  */.  pRoot 
24620 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
24630 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
24640 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
24650 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73  pgnoRoot );.  as
24660 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49  sert( pRoot->isI
24670 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b  nit && (pCur->pK
24680 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f  eyInfo==0)==pRoo
24690 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20  t->intKey );..  
246a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
246b0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
246c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
246d0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
246e0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
246f0 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
24700 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
24710 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
24720 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
24730 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
24740 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
24750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24760 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
24770 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
24780 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
24790 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
247a0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
247b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
247c0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
247d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
247e0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
247f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
24800 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
24810 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
24820 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
24830 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
24840 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
24850 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
24860 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
24870 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
24880 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
24890 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
248a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
248b0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
248c0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
248d0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
248e0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
248f0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
24900 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
24910 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
24920 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
24930 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24940 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
24950 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24960 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
24970 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
24980 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24990 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
249a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
249b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
249c0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
249d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
249e0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
249f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24a00 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
24a10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24a20 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24a30 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
24a40 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
24a50 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24a60 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
24a70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
24a80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24a90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
24aa0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
24ab0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
24ac0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
24ad0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
24ae0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
24af0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
24b00 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
24b10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
24b20 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
24b30 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
24b40 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
24b50 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
24b60 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
24b70 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
24b80 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
24b90 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
24ba0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
24bb0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
24bc0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
24bd0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
24be0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24bf0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
24c00 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
24c10 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
24c20 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
24c30 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
24c40 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
24c50 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
24c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24c70 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
24c80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24c90 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
24ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24cb0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
24cc0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
24cd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24ce0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24cf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24d00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24d10 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
24d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24d30 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
24d40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24d50 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
24d60 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
24d70 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
24d80 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
24d90 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
24da0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24db0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
24dc0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
24dd0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
24de0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
24df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24e10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
24e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
24e30 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
24e40 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
24e50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
24e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24e70 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
24e80 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
24e90 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
24ea0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
24eb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
24ec0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
24ed0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
24ee0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
24ef0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
24f00 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
24f10 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
24f20 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
24f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24f40 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
24f50 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
24f60 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24f70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24f80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24f90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24fa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24fb0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
24fc0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
24fd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
24fe0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
24ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25000 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
25010 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
25020 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
25030 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
25040 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
25050 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25060 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
25070 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
25080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25090 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
250a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
250b0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
250c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
250d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
250e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
250f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
25100 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
25110 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
25120 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
25130 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
25140 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25150 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
25160 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
25170 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25180 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
25190 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
251a0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
251b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
251c0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
251d0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
251e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
251f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
25200 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
25210 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25220 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25230 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25240 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25250 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25260 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
25270 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
25280 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
25290 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
252a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
252b0 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
252c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
252d0 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
252e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
252f0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
25300 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
25310 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
25320 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
25330 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
25340 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
25350 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
25360 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
25370 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
25380 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
25390 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
253a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
253b0 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
253c0 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
253d0 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
253e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
253f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
25400 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
25410 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25420 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
25430 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
25440 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
25450 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
25460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25470 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
25480 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
25490 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
254a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
254b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
254c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
254d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
254e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
254f0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
25500 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25510 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
25520 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
25530 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
25540 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25550 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25560 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25570 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
25580 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
25590 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
255a0 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
255b0 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
255c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
255d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
255e0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
255f0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
25600 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
25610 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
25620 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
25630 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
25640 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
25650 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
25660 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
25670 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
25680 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
25690 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
256a0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
256b0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
256c0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
256d0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
256e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
256f0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
25700 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
25710 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
25720 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
25730 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
25740 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
25750 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
25760 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
25770 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
25780 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
25790 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
257a0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
257b0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
257c0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
257d0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
257e0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
257f0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
25800 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
25810 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
25820 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
25830 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
25840 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
25850 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
25860 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
25870 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
25880 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
25890 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
258a0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
258b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
258c0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
258e0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
258f0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
25900 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25910 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
25920 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
25930 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
25940 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
25950 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
25960 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
25970 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25980 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25990 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
259a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
259b0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
259c0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
259d0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
259e0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
259f0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
25a00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
25a10 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
25a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25a30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
25a40 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
25a50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25a60 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
25a70 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
25a80 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
25a90 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
25aa0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
25ab0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
25ac0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
25ad0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
25ae0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
25af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25b00 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
25b10 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
25b20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25b30 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
25b40 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
25b50 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
25b60 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
25b70 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
25b80 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
25b90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
25ba0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25bb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25bc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
25bd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25be0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
25bf0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
25c00 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
25c10 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
25c20 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
25c30 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
25c40 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
25c50 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
25c60 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
25c70 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
25c80 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
25c90 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
25ca0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
25cb0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
25cc0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
25cd0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25ce0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
25cf0 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
25d00 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
25d10 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
25d20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
25d30 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
25d40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
25d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25d60 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
25d70 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
25d80 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
25d90 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
25da0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
25db0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25dc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
25dd0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
25de0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
25df0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
25e00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
25e10 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25e20 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25e30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25e40 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
25e50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25e60 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25e70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25e80 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
25e90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25ea0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
25eb0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25ec0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25ed0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
25ee0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25ef0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
25f00 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
25f10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25f20 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25f30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25f40 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25f50 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
25f60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25f70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
25f80 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
25f90 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
25fa0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
25fb0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
25fc0 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  dx;.    Pgno chl
25fd0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
25fe0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
25ff0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26000 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  ge];.    int c;.
26010 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
26020 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
26030 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
26040 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
26050 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
26060 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
26070 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
26080 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
26090 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
260a0 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
260b0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
260c0 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
260d0 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
260e0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
260f0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
26100 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
26110 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
26120 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
26130 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
26140 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
26150 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
26160 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
26170 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
26180 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
26190 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
261a0 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
261b0 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
261c0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
261d0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
261e0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
261f0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
26200 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
26210 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
26220 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
26230 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
26240 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
26250 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
26260 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
26270 31 36 29 28 69 64 78 20 3d 20 75 70 72 29 3b 0a  16)(idx = upr);.
26280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26290 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
262a0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
262b0 29 28 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72  )(idx = (upr+lwr
262c0 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
262d0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75  for(;;){.      u
262e0 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
26310 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
26320 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20   pPage */..     
26330 20 61 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43   assert( idx==pC
26340 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26350 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 20 20  iPage] );.      
26360 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26370 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c   = 0;.      pCel
26380 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
26390 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
263a0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
263b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
263c0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
263d0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
263e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
263f0 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
26400 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
26410 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
26420 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
26430 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
26440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26450 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
26460 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
26470 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
26480 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  f( nCellKey==int
26490 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
264a0 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
264b0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
264c0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
264d0 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
264e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
264f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26500 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
26510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
26520 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
26530 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c         pCur->val
26540 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
26550 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
26560 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
26570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26580 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
26590 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
265a0 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
265b0 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
265c0 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
265d0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
265e0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
265f0 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
26600 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
26610 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
26620 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
26630 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
26640 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
26650 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
26660 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
26670 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
26680 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
26690 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
266a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
266b0 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
266c0 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
266d0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
266e0 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
266f0 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
26700 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
26710 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
26720 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
26730 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
26740 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
26750 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
26760 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
26770 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
26780 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
26790 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
267a0 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20  Payload.        
267b0 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43   /* && (pCell+nC
267c0 65 6c 6c 29 3c 70 50 61 67 65 2d 3e 61 44 61 74  ell)<pPage->aDat
267d0 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  aEnd */.        
267e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
267f0 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
26800 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
26810 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
26820 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
26830 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
26840 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
26850 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
26860 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
26870 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
26880 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
26890 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
268a0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
268b0 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
268c0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
268d0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
268e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
268f0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
26900 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
26910 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
26920 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
26930 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
26940 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
26950 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
26960 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
26970 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
26980 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28 70 43         /* && (pC
26990 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50  ell+nCell+2)<=pP
269a0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f  age->aDataEnd */
269b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
269c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
269d0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
269e0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
269f0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
26a00 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
26a10 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
26a20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
26a30 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
26a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
26a50 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
26a60 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
26a70 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
26a80 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
26a90 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
26aa0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
26ab0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
26ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ad0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
26ae0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
26af0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
26b00 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
26b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
26b20 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
26b30 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
26b40 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
26b50 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
26b60 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
26b70 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
26b80 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
26b90 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
26ba0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
26bb0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
26bc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
26bd0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
26be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
26bf0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
26c00 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
26c10 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
26c20 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
26c30 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
26c40 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
26c50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
26c60 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
26c70 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
26c80 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
26c90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
26ca0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
26cb0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
26cc0 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
26cd0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
26ce0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
26cf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26d00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
26d10 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26d20 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26d30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
26d40 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
26d50 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
26d60 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
26d70 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
26d80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26da0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
26db0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
26dc0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
26dd0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
26de0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
26df0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
26e00 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26e10 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
26e20 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
26e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
26e40 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
26e50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26e60 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
26e70 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26e80 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26e90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
26ea0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
26eb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26ec0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26ed0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
26ee0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
26ef0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26f00 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
26f10 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
26f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26f30 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
26f40 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26f50 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
26f60 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
26f70 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
26f80 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
26f90 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
26fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26fb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26fc0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
26fd0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
26fe0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  2);.    }.    as
26ff0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
27000 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
27010 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
27020 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
27030 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
27040 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
27050 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
27060 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
27070 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
27080 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
27090 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
270a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
270b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
270c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
270d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
270e0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
270f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
27100 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
27110 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
27120 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27130 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27140 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27150 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27160 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27170 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
27180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27190 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
271a0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
271b0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
271c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
271d0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
271e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
271f0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
27200 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
27210 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27220 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
27230 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27240 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27250 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
27260 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
27270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
27280 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
27290 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
272a0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
272b0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
272c0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
272d0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
272e0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
272f0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
27300 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
27310 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
27320 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
27330 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
27340 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
27350 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
27360 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
27370 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
27380 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
27390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
273a0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
273b0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
273c0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
273d0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
273e0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
273f0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
27400 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
27410 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
27420 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
27430 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
27440 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
27450 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
27460 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
27470 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
27480 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
27490 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
274a0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
274b0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
274c0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
274d0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
274e0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
274f0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
27500 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
27510 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
27520 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
27530 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
27540 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
27550 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
27560 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
27570 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
27580 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
27590 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
275a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
275b0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
275c0 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
275d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
275e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
275f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27600 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
27610 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27620 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
27630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27640 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
27650 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
27660 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
27670 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
27680 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
27690 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
276a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
276b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
276c0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
276d0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
276e0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
276f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
27700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27710 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
27720 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
27730 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27740 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
27750 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
27760 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27770 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
27780 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
27790 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
277a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
277b0 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
277c0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
277d0 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
277e0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
277f0 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
27800 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
27810 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
27820 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
27830 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
27840 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
27850 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
27860 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
27870 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
27880 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27890 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
278a0 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
278b0 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
278c0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
278d0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
278e0 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
278f0 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
27900 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
27910 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
27920 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
27930 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
27940 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
27950 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
27960 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
27970 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
27980 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
27990 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
279a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
279b0 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
279c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
279d0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
279e0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
279f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27a00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
27a20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27a30 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
27a40 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
27a50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
27a60 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
27a70 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
27a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
27aa0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
27ab0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
27ac0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27ad0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
27ae0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
27af0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
27b00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
27b10 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
27b20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
27b30 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
27b40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
27b50 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
27b60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27b70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27b80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
27b90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
27ba0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
27bb0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
27bc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27bd0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
27be0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
27bf0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
27c00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
27c10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
27c20 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
27c30 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
27c40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
27c50 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
27c60 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
27c70 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
27c80 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
27c90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
27ca0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
27cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
27cc0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
27cd0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
27ce0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
27cf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d00 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
27d10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
27d20 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
27d30 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
27d40 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
27d50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27d60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
27d70 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
27d80 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27d90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27da0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
27db0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
27dc0 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
27dd0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
27de0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
27df0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
27e00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27e10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
27e20 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
27e30 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
27e40 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
27e50 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e70 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
27e80 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
27e90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
27ea0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27eb0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
27ec0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
27ed0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
27ee0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
27ef0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
27f00 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
27f10 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
27f20 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
27f30 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
27f40 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
27f50 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
27f60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27f70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
27f80 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
27f90 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
27fa0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27fb0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
27fc0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27fd0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
27fe0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27ff0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
28000 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
28010 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
28020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
28040 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
28050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
28060 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
28070 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
28080 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
28090 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
280a0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
280b0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
280c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
280d0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
280e0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
280f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
28110 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
28120 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
28130 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
28140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
28150 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
28160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28170 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
28180 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
28190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
281a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
281b0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
281c0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
281d0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
281e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
281f0 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
28200 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
28210 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
28220 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
28230 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
28240 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
28250 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
28260 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
28270 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
28280 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
28290 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
282a0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
282b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
282c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
282d0 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
282e0 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
282f0 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
28300 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
28310 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
28320 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
28330 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
28340 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
28350 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
28360 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
28370 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
28380 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
28390 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
283a0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
283b0 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
283c0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
283d0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
283e0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
283f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
28400 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
28410 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
28420 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
28430 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
28440 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
28450 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
28460 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
28470 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
28480 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
28490 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
284a0 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
284b0 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
284c0 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
284d0 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
284e0 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
284f0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
28500 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
28510 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
28520 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
28530 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
28540 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
28550 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
28560 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
28570 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
28580 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
28590 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
285a0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
285b0 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
285c0 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
285d0 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
285e0 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
285f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28600 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
28610 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
28620 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
28630 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
28640 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
28650 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
28660 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
28670 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
28680 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
28690 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
286a0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
286b0 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
286c0 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
286d0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
286e0 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
286f0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
28700 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
28710 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
28720 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
28730 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
28740 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
28750 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
28760 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
28770 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28780 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
28790 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
287a0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
287b0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
287c0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
287d0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
287e0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
287f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
28800 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
28810 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
28820 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
28830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28840 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28860 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
28870 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
28880 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
28890 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
288a0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
288b0 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
288c0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
288d0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
288e0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
288f0 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
28900 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28910 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
28920 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
28930 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
28940 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
28950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28960 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
28970 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
28980 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
28990 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
289a0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
289b0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
289c0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
289d0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
289e0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
289f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
28a00 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
28a10 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
28a20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
28a30 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
28a40 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
28a50 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
28a60 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
28a70 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
28a80 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
28a90 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
28aa0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
28ab0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
28ac0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
28ad0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
28ae0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
28af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
28b00 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
28b10 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
28b20 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
28b30 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
28b40 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
28b50 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
28b60 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
28b70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28b80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
28b90 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28ba0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
28bb0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
28bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28bd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28be0 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
28bf0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
28c00 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
28c10 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
28c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28c30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
28c40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
28c50 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
28c60 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
28c70 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
28c80 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
28c90 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
28ca0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
28cb0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
28cc0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
28cd0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
28ce0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
28cf0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
28d00 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
28d10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28d20 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
28d30 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
28d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28d50 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28d60 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
28d70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
28d80 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
28d90 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
28da0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
28db0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
28dc0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
28dd0 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
28de0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
28df0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
28e00 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
28e10 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
28e20 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
28e30 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
28e40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
28e50 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
28e60 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
28e70 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
28e80 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
28e90 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
28ea0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
28eb0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
28ec0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
28ed0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
28ee0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
28ef0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
28f00 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
28f10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28f20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
28f30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
28f40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
28f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
28f60 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
28f70 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
28f80 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
28f90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28fa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28fb0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
28fc0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
28fd0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28fe0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
28ff0 6b 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, 0, 0);.      
29000 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
29010 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
29020 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
29030 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
29040 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
29050 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
29060 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
29070 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
29080 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20  Data!=0 );..    
29090 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
290a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
290b0 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65  ); /* # of leave
290c0 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20  s on this trunk 
290d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
290e0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
290f0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
29100 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
29110 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
29120 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
29130 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
29140 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
29150 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
29160 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
29170 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
29180 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
29190 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
291a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
291b0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
291c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
291d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
291e0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
291f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
29200 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
29210 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29220 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
29230 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
29240 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
29250 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
29260 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
29270 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
29280 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
29290 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
292a0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
292b0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
292c0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
292d0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
292e0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
292f0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
29300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
29310 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
29320 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
29330 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
29340 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
29350 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
29360 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
29370 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29380 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29390 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
293a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
293b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
293c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
293d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
293e0 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
293f0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
29400 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
29410 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
29420 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
29430 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
29440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
29450 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
29460 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
29470 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
29480 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
29490 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
294a0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
294b0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
294c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
294d0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
294e0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
294f0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
29500 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
29510 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
29520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29530 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
29540 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29550 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
29560 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29570 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
29580 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
29590 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
295a0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
295b0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
295c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
295d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
295e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
295f0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
29600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29620 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
29630 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
29640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
29670 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29680 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
29690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
296a0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
296b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
296c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
296d0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
296e0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
296f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29700 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
29710 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
29720 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
29730 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
29740 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
29750 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
29760 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
29770 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
29780 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
29790 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
297a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
297b0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
297c0 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
297d0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
297e0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
297f0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
29800 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
29810 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
29820 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
29830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29840 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29860 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
29870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29890 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
298a0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
298b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
298c0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
298d0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
298e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
298f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29910 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29920 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
29930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
29940 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29950 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
29960 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29990 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
299a0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
299b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
299c0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
299d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
299e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
299f0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
29a00 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
29a10 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
29a20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
29a30 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
29a40 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
29a50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
29a60 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
29a70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29a80 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
29a90 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
29aa0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
29ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29ac0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
29ad0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
29ae0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29af0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
29b00 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
29b10 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
29b20 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29b30 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
29b40 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
29b50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
29b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29b70 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
29b80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
29b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29bb0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29bc0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
29bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29be0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
29bf0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
29c00 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
29c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
29c30 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
29c40 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29c50 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
29c60 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
29c70 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
29c80 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
29c90 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
29ca0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
29cb0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
29cc0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
29cd0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
29ce0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
29cf0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
29d00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
29d10 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
29d20 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
29d30 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
29d40 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
29d50 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
29d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29d70 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
29d80 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
29d90 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
29da0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
29db0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
29dc0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
29dd0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
29de0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
29df0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
29e00 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
29e10 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
29e20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
29e40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29e50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29e60 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
29e70 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
29e80 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
29e90 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
29ea0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
29eb0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
29ec0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
29ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29ee0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
29ef0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
29f00 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
29f10 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
29f30 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
29f50 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
29f60 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
29f70 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
29f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29f90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
29fa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29fb0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
29fc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
29fd0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
29fe0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
29ff0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
2a000 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a010 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
2a020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
2a030 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
2a040 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a050 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a060 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2a070 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a080 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2a090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a0a0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
2a0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
2a0c0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2a0d0 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
2a0e0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
2a0f0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2a100 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2a110 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2a120 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
2a130 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
2a140 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
2a150 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2a160 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
2a170 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
2a180 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
2a190 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
2a1a0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
2a1b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a1c0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
2a1d0 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
2a1e0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
2a1f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a200 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a210 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2a220 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2a230 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2a240 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a250 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
2a260 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
2a270 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2a280 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2a290 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
2a2a0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2a2b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
2a2c0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
2a2d0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2a2e0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
2a2f0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
2a300 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20  (pBt, *pPgno);. 
2a310 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2a320 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2a330 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2a340 6e 6f 43 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20  noContent, 0);. 
2a350 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2a360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a370 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2a380 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a390 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2a3a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2a3b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a3d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2a3e0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2a3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2a410 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2a420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a430 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2a440 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2a450 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2a460 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
2a470 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
2a480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2a490 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
2a4a0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2a4b0 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
2a4c0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
2a4d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2a4e0 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
2a4f0 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
2a500 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
2a510 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2a520 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
2a530 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
2a540 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
2a550 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
2a560 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
2a570 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
2a580 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
2a590 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
2a5a0 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
2a5b0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
2a5c0 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
2a5d0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
2a5e0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2a5f0 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
2a600 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
2a610 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
2a620 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
2a630 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
2a640 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
2a650 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
2a660 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
2a670 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
2a680 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
2a690 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
2a6a0 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
2a6b0 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
2a6c0 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
2a6d0 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
2a6e0 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
2a6f0 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
2a700 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
2a710 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
2a720 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
2a730 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2a740 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
2a750 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
2a760 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
2a770 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
2a780 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
2a790 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
2a7a0 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
2a7b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2a7c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
2a7d0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
2a7e0 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2a7f0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
2a800 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
2a810 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
2a820 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
2a830 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
2a840 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
2a850 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
2a860 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2a870 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
2a880 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a890 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
2a8a0 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
2a8b0 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
2a8c0 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
2a8d0 74 65 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  te));..    rc = 
2a8e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a8f0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
2a900 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2a910 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a920 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
2a930 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
2a940 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2a950 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
2a960 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
2a970 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a980 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2a990 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2a9a0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
2a9b0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
2a9c0 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
2a9d0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
2a9e0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
2a9f0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
2aa00 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
2aa10 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
2aa20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2aa30 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
2aa40 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
2aa50 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
2aa60 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
2aa70 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
2aa80 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
2aa90 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
2aaa0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
2aab0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2aac0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
2aad0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2aae0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
2aaf0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
2ab00 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
2ab10 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
2ab20 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
2ab30 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
2ab40 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
2ab50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ab60 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
2ab70 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
2ab80 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  ontent, 0);.    
2ab90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2abb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2abc0 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
2abd0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2abe0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
2abf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ac00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ac10 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
2ac20 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
2ac30 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2ac40 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2ac50 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
2ac60 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
2ac70 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
2ac80 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
2ac90 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
2aca0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
2acb0 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
2acc0 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
2acd0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2ace0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2acf0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2ad00 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2ad10 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
2ad20 43 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20  Content, 0);.   
2ad30 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ad40 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2ad50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ad60 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2ad70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2ad80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ada0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
2adb0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2adc0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2add0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
2ade0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
2adf0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
2ae00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2ae10 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
2ae20 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
2ae30 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2ae40 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
2ae50 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2ae60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ae70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
2ae80 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2ae90 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
2aea0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
2aeb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2aec0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2aed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aee0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2aef0 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
2af00 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
2af10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
2af20 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  age = 0;.  }.  a
2af30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2af40 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
2af50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2af60 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2af70 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
2af80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2af90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2afa0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
2afb0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
2afc0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
2afd0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
2afe0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
2aff0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2b000 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
2b010 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
2b020 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
2b030 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2b040 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2b050 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2b060 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
2b070 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
2b080 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
2b090 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
2b0a0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
2b0b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2b0c0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
2b0d0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
2b0e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
2b0f0 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
2b100 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
2b110 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
2b120 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
2b130 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
2b140 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2b150 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
2b160 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
2b170 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
2b180 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
2b190 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2b1a0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
2b1b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
2b1c0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
2b1d0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
2b1e0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2b1f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b200 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
2b210 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2b220 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
2b230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b240 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2b250 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
2b260 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
2b270 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2b280 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2b290 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
2b2a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2b2b0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
2b2c0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b2e0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
2b2f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
2b300 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b330 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
2b340 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b360 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2b370 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
2b380 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
2b390 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2b3a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2b3b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2b3c0 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
2b3d0 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
2b3e0 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
2b3f0 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
2b400 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
2b410 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
2b420 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
2b430 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
2b440 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
2b450 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
2b460 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2b470 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
2b480 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
2b490 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
2b4a0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
2b4b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2b4c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2b4d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2b4e0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2b4f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
2b500 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
2b510 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2b520 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2b530 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2b540 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
2b550 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
2b560 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2b570 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
2b580 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
2b590 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
2b5a0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
2b5b0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
2b5c0 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
2b5d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
2b5e0 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
2b5f0 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
2b600 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
2b610 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2b620 65 2c 20 26 70 50 61 67 65 2c 20 30 2c 20 30 29  e, &pPage, 0, 0)
2b630 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
2b640 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
2b650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b660 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2b670 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
2b680 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2b690 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2b6a0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
2b6b0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
2b6c0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
2b6d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2b6e0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2b6f0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2b700 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
2b710 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2b720 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
2b730 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
2b740 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
2b750 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2b760 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
2b770 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
2b780 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2b790 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
2b7a0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2b7b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
2b7c0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
2b7d0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
2b7e0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2b7f0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
2b800 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
2b810 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
2b820 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2b830 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
2b840 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
2b850 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
2b860 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2b870 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
2b880 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
2b890 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
2b8a0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
2b8b0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
2b8c0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
2b8d0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
2b8e0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
2b8f0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
2b900 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
2b910 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
2b920 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
2b930 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2b940 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
2b950 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
2b960 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
2b970 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
2b980 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
2b990 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2b9a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
2b9b0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
2b9c0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
2b9d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2b9e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2b9f0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
2ba00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ba10 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2ba20 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
2ba30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ba40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2ba50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2ba60 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
2ba70 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2ba80 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
2ba90 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2baa0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
2bab0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
2bac0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2bad0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
2bae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2baf0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2bb00 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2bb10 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2bb20 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
2bb30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2bb40 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
2bb50 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2bb60 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
2bb70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
2bb80 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
2bb90 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
2bba0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
2bbb0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
2bbc0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2bbd0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2bbe0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
2bbf0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
2bc00 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
2bc10 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
2bc20 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
2bc30 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2bc40 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
2bc50 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
2bc60 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
2bc70 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
2bc80 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2bc90 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
2bca0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
2bcb0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
2bcc0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
2bcd0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
2bce0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2bcf0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2bd00 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2bd10 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
2bd20 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
2bd30 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
2bd40 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
2bd50 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
2bd60 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2bd70 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
2bd80 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
2bd90 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
2bda0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2bdb0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
2bdc0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
2bdd0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
2bde0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2bdf0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
2be00 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
2be10 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
2be20 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
2be30 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
2be40 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
2be50 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
2be60 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
2be70 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
2be80 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
2be90 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
2bea0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2beb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bec0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2bed0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2bee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bef0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2bf00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2bf10 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
2bf20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2bf30 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
2bf40 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
2bf50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2bf60 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
2bf70 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2bf80 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
2bf90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2bfa0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
2bfb0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2bfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bfd0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
2bfe0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
2bff0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2c000 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
2c010 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
2c020 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
2c030 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
2c040 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
2c050 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2c060 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2c070 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
2c080 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
2c090 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
2c0a0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
2c0b0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
2c0c0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2c0d0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
2c0e0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
2c0f0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2c100 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
2c110 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2c120 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2c130 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
2c140 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2c150 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2c160 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2c170 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
2c180 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
2c190 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
2c1a0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
2c1b0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
2c1c0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2c1d0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
2c1e0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
2c1f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2c200 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2c210 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
2c220 2c 20 30 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 0, 0)) ){.    
2c230 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2c240 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
2c250 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c260 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2c270 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2c290 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c2a0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
2c2b0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
2c2c0 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
2c2d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
2c2e0 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
2c2f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2c300 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
2c310 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2c320 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
2c330 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
2c340 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2c350 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
2c360 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
2c370 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
2c380 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2c390 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2c3a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
2c3b0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2c3c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2c3e0 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
2c3f0 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
2c400 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2c410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c420 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
2c430 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
2c440 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
2c450 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2c460 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
2c470 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2c480 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2c490 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
2c4a0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
2c4b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2c4c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2c4d0 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
2c4e0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2c4f0 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
2c500 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
2c510 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
2c520 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
2c530 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
2c540 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2c550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2c560 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2c570 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ) );.  btreePars
2c580 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2c590 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2c5a0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2c5b0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
2c5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2c5d0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
2c5e0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
2c5f0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
2c600 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2c610 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  ( pCell+info.iOv
2c620 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65  erflow+3 > pPage
2c630 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
2c640 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
2c650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2c660 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
2c670 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
2c680 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
2c690 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
2c6a0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
2c6b0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2c6c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2c6d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
2c6e0 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
2c6f0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2c700 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
2c710 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
2c720 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
2c730 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
2c740 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
2c750 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
2c760 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
2c770 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
2c780 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
2c790 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
2c7a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
2c7b0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
2c7c0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
2c7d0 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
2c7e0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
2c7f0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
2c800 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
2c810 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
2c820 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
2c830 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2c840 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
2c850 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
2c860 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2c870 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
2c880 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
2c890 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2c8a0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2c8b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2c8c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2c8d0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
2c8e0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2c8f0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
2c900 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
2c910 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
2c920 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2c940 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
2c950 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
2c960 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
2c970 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
2c980 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
2c990 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
2c9a0 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
2c9b0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2c9c0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
2c9d0 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
2c9e0 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
2c9f0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2ca00 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
2ca10 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2ca20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
2ca30 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
2ca40 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
2ca50 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
2ca60 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
2ca70 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
2ca80 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
2ca90 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
2caa0 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
2cab0 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
2cac0 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
2cad0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2cae0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
2caf0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
2cb00 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
2cb10 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
2cb20 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
2cb30 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
2cb40 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
2cb50 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
2cb60 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
2cb70 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
2cb80 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
2cb90 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
2cba0 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
2cbb0 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
2cbc0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2cbd0 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
2cbe0 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
2cbf0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
2cc00 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
2cc10 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
2cc20 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
2cc30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2cc40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2cc50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cc60 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
2cc70 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
2cc80 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
2cc90 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
2cca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2ccb0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
2ccc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2ccd0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2cce0 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
2ccf0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
2cd00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2cd10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
2cd20 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
2cd30 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
2cd40 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
2cd50 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
2cd60 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
2cd70 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
2cd80 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
2cd90 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
2cda0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
2cdb0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
2cdc0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
2cdd0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
2cde0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2cdf0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
2ce00 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
2ce10 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
2ce20 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
2ce30 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
2ce40 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
2ce50 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
2ce60 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
2ce70 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
2ce80 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
2ce90 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2cea0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
2ceb0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
2cec0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
2ced0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
2cee0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
2cef0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
2cf00 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2cf10 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
2cf20 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
2cf30 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2cf40 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
2cf50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2cf60 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2cf70 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
2cf80 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
2cf90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2cfa0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
2cfb0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
2cfc0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2cfd0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2cfe0 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
2cff0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
2d000 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
2d010 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
2d020 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
2d030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2d040 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
2d050 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
2d060 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
2d070 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2d080 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
2d090 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
2d0a0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
2d0b0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
2d0c0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
2d0d0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
2d0e0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
2d0f0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2d100 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
2d110 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
2d120 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
2d130 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
2d140 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
2d150 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d160 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
2d170 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
2d180 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
2d190 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2d1a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2d1b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d1c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2d1d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2d1e0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2d1f0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2d200 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2d210 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2d220 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2d230 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2d240 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2d250 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2d260 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2d270 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2d280 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2d290 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2d2a0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2d2b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d2c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d2d0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2d2e0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2d2f0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2d300 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
2d310 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d320 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
2d330 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d340 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
2d350 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2d360 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
2d370 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
2d380 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2d390 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
2d3a0 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
2d3b0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2d3c0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2d3d0 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
2d3e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2d3f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2d400 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
2d410 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
2d420 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
2d430 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
2d440 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
2d450 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
2d460 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
2d470 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
2d480 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
2d490 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
2d4a0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
2d4b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d4c0 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
2d4d0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
2d4e0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
2d4f0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
2d500 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
2d510 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
2d520 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
2d530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d540 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d550 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
2d560 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b  yload += (int)nK
2d570 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
2d580 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
2d590 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
2d5a0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
2d5b0 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
2d5c0 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
2d5d0 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
2d5e0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
2d5f0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
2d600 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2d610 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
2d620 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
2d630 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
2d640 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2d650 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2d660 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
2d670 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
2d680 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
2d690 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
2d6a0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
2d6b0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2d6c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2d6d0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2d6e0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
2d6f0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
2d700 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
2d710 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
2d720 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
2d730 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
2d740 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
2d750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
2d760 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
2d770 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2d780 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
2d790 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
2d7a0 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
2d7b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d7c0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
2d7d0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2d7e0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2d7f0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
2d800 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
2d810 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
2d820 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
2d830 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
2d840 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
2d850 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2d860 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
2d870 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
2d880 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2d890 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2d8a0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
2d8b0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
2d8c0 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
2d8d0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
2d8e0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
2d8f0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
2d900 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
2d910 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
2d920 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
2d930 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
2d940 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
2d950 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
2d960 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
2d970 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
2d980 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
2d990 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
2d9a0 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
2d9b0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
2d9c0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
2d9d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2d9e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
2d9f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2da00 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2da10 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
2da20 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
2da30 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2da40 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2da50 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
2da60 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
2da70 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
2da80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2da90 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2daa0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
2dab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2dac0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2dad0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
2dae0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2daf0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
2db00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2db10 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
2db20 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2db30 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
2db40 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
2db50 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2db60 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2db70 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2db80 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2db90 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2dba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2dbb0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2dbc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2dbd0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2dbe0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2dbf0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
2dc00 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
2dc10 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2dc20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2dc30 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2dc40 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2dc50 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
2dc60 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
2dc70 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2dc80 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
2dc90 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2dca0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2dcb0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2dcc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2dcd0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2dce0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2dcf0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
2dd00 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2dd10 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2dd20 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
2dd30 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
2dd40 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
2dd50 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
2dd60 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
2dd70 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
2dd80 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
2dd90 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
2dda0 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
2ddb0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
2ddc0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
2ddd0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
2dde0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
2ddf0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
2de00 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2de10 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2de20 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
2de30 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2de40 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
2de50 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2de60 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2de70 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2de80 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2de90 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
2dea0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2deb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
2dec0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
2ded0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2dee0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
2def0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
2df00 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
2df10 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
2df20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2df30 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2df40 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
2df50 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
2df60 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
2df70 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2df80 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2df90 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2dfa0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2dfb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2dfc0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
2dfd0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
2dfe0 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
2dff0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
2e000 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
2e010 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
2e020 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
2e030 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
2e040 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
2e050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
2e060 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
2e070 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
2e080 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
2e090 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
2e0a0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
2e0b0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
2e0c0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
2e0d0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
2e0e0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2e0f0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
2e100 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2e110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e120 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2e130 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
2e140 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
2e150 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
2e160 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
2e170 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
2e180 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
2e190 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
2e1a0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
2e1b0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
2e1c0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
2e1d0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
2e1e0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
2e1f0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
2e200 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
2e210 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
2e220 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
2e230 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
2e240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2e250 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
2e260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e270 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
2e280 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
2e290 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
2e2a0 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
2e2b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2e2c0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
2e2d0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
2e2e0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
2e2f0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
2e300 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
2e310 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
2e320 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
2e330 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
2e340 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
2e350 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20    u8 *endPtr;   
2e360 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f 70    /* End of loop
2e370 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2e380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2e390 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2e3a0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
2e3b0 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
2e3c0 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
2e3d0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
2e3e0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
2e3f0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2e400 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2e410 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
2e420 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2e430 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
2e440 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
2e450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2e460 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2e470 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2e480 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e490 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e4a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e4b0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
2e4c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
2e4d0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
2e4e0 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
2e4f0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
2e500 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
2e510 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
2e520 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
2e530 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2e540 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
2e550 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
2e560 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2e570 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
2e580 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
2e590 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
2e5a0 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
2e5b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2e5c0 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
2e5d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e5e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2e5f0 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
2e600 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
2e610 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2e620 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2e630 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e  return;.  }.  en
2e640 64 50 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  dPtr = &pPage->a
2e650 43 65 6c 6c 49 64 78 5b 32 2a 70 50 61 67 65 2d  CellIdx[2*pPage-
2e660 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61  >nCell - 2];.  a
2e670 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2e680 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2e690 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2e6a0 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2e6b0 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68   aligned */.  wh
2e6c0 69 6c 65 28 20 70 74 72 3c 65 6e 64 50 74 72 20  ile( ptr<endPtr 
2e6d0 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a 29 70 74  ){.    *(u16*)pt
2e6e0 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b  r = *(u16*)&ptr[
2e6f0 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 32  2];.    ptr += 2
2e700 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
2e710 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
2e720 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2e730 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2e740 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
2e750 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
2e760 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
2e770 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
2e780 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
2e790 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
2e7a0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
2e7b0 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
2e7c0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2e7d0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
2e7e0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
2e7f0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
2e800 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
2e810 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
2e820 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
2e830 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
2e840 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
2e850 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
2e860 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
2e870 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
2e880 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
2e890 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
2e8a0 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
2e8b0 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
2e8c0 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
2e8d0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
2e8e0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
2e8f0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
2e900 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
2e910 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
2e920 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
2e930 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
2e940 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
2e950 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
2e960 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
2e970 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
2e980 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
2e990 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
2e9a0 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
2e9b0 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
2e9c0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
2e9d0 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
2e9e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2e9f0 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
2ea00 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2ea10 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
2ea20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
2ea30 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
2ea40 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
2ea50 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
2ea60 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
2ea70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
2ea80 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
2ea90 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2eaa0 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
2eab0 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
2eac0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
2ead0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
2eae0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
2eaf0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
2eb00 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
2eb10 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
2eb20 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
2eb30 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
2eb40 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
2eb50 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
2eb60 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
2eb70 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
2eb80 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
2eb90 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
2eba0 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
2ebb0 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
2ebc0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
2ebd0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
2ebe0 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
2ebf0 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
2ec00 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
2ec10 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
2ec20 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
2ec30 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
2ec40 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
2ec50 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
2ec60 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
2ec70 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
2ec80 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
2ec90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2eca0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2ecb0 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
2ecc0 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
2ecd0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
2ece0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2ecf0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
2ed00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2ed10 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
2ed20 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
2ed30 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
2ed40 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
2ed50 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
2ed60 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
2ed70 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2ed80 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2ed90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2eda0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
2edb0 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
2edc0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
2edd0 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
2ede0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
2edf0 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
2ee00 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20  /.  u8 *endPtr; 
2ee10 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2ee20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69  the loop */..  i
2ee30 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
2ee40 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
2ee50 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2ee60 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
2ee70 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
2ee80 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
2ee90 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
2eea0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2eeb0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2eec0 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2eed0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2eee0 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
2eef0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ef00 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
2ef10 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
2ef20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2ef30 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2ef40 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
2ef50 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
2ef60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ef70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ef80 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ef90 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2efa0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2efb0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2efc0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
2efd0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
2efe0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
2eff0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
2f000 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
2f010 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
2f020 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
2f030 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
2f040 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
2f050 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
2f060 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
2f070 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
2f080 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
2f090 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
2f0a0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
2f0b0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
2f0c0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
2f0d0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
2f0e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2f0f0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
2f100 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2f110 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2f120 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
2f130 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
2f140 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2f150 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2f160 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2f170 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2f180 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2f190 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2f1a0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2f1b0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2f1c0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2f1d0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2f1e0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2f1f0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2f200 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2f210 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2f220 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2f230 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
2f240 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
2f250 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20  ge->apOvfl[0])) 
2f260 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70  );.    pPage->ap
2f270 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b  Ovfl[j] = pCell;
2f280 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76  .    pPage->aiOv
2f290 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a  fl[j] = (u16)i;.
2f2a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2f2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f2c0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2f2d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2f2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f2f0 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2f300 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2f310 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2f320 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f330 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2f340 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2f350 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2f360 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
2f370 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
2f380 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
2f390 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
2f3a0 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2f3b0 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
2f3c0 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
2f3d0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
2f3e0 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
2f3f0 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
2f400 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
2f410 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
2f420 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
2f430 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
2f440 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
2f450 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
2f460 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
2f470 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
2f480 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
2f490 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
2f4a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2f4b0 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
2f4c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f4d0 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
2f4e0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
2f4f0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
2f500 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
2f510 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
2f520 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
2f530 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2f540 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
2f550 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2f560 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
2f570 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2f580 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e    ptr = &data[en
2f590 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d  d];.    endPtr =
2f5a0 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20   &data[ins];.   
2f5b0 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
2f5c0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29  _PTR_TO_INT(ptr)
2f5d0 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74  &1)==0 );  /* pt
2f5e0 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79  r is always 2-by
2f5f0 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
2f600 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64    while( ptr>end
2f610 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75  Ptr ){.      *(u
2f620 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2f630 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  )&ptr[-2];.     
2f640 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d   ptr -= 2;.    }
2f650 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2f660 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2f670 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2f680 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2f690 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2f6a0 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2f6b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f6c0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2f6d0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2f6e0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2f6f0 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2f700 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2f710 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2f720 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2f730 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2f740 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2f750 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2f760 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2f770 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f780 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2f790 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2f7a0 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2f7b0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2f7c0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2f7d0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2f7e0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2f7f0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2f800 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2f810 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2f820 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2f830 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2f840 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2f850 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2f860 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2f870 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2f880 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2f890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2f8a0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2f8b0 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2f8c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2f8d0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2f8e0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2f8f0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2f900 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2f910 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2f920 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2f930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f940 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2f950 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2f960 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2f970 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2f980 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2f990 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2f9a0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2f9b0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2f9c0 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2f9d0 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2f9e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2f9f0 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2fa00 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2fa10 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2fa20 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2fa30 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2fa40 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2fa50 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2fa60 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2fa70 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2fa80 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2fa90 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2faa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fab0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2fac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fad0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2fae0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2faf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2fb00 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2fb10 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2fb20 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20  ge->pBt).       
2fb30 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f       && (int)MX_
2fb40 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2fb50 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65  <=10921);.  asse
2fb60 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2fb70 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2fb80 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2fb90 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2fba0 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73  the page has jus
2fbb0 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  t been zeroed by
2fbc0 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20   zeroPage() */. 
2fbd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fbe0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2fbf0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f  sert( get2byteNo
2fc00 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
2fc10 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
2fc20 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
2fc30 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  Page->aCellIdx[n
2fc40 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2fc50 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2fc60 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2fc70 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2fc80 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69  u16 sz = aSize[i
2fc90 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ];.    pCellptr 
2fca0 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
2fcb0 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75  dy -= sz;.    pu
2fcc0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2fcd0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2fce0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2fcf0 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2fd00 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75  ], sz);.  }.  pu
2fd10 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2fd20 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2fd30 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2fd40 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2fd50 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2fd60 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2fd70 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2fd80 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2fd90 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2fda0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2fdb0 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2fdc0 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2fdd0 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2fde0 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2fdf0 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2fe00 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2fe10 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2fe20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2fe30 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2fe40 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2fe50 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2fe60 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2fe70 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2fe80 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2fe90 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2fea0 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2feb0 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2fec0 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2fed0 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2fee0 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2fef0 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2ff00 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2ff10 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2ff20 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2ff30 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2ff40 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2ff50 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2ff60 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2ff70 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2ff80 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2ff90 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2ffa0 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2ffb0 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2ffc0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2ffd0 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2ffe0 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2fff0 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
30000 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
30010 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
30020 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
30030 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
30040 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
30050 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
30060 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
30070 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
30080 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
30090 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
300a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
300b0 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
300c0 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
300d0 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
300e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
300f0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
30100 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
30110 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
30120 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
30130 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
30140 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
30150 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
30160 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
30170 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
30180 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
30190 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
301a0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
301b0 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65  g to balance the
301c0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
301d0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
301e0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
301f0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
30200 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
30210 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
30220 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
30230 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
30240 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
30250 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
30260 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
30270 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
30280 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
30290 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
302a0 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
302b0 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
302c0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
302d0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
302e0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
302f0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
30300 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
30310 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
30320 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
30330 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
30340 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
30350 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
30360 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
30370 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
30380 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
30390 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
303a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
303b0 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
303c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
303d0 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
303e0 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
303f0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
30400 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
30410 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
30420 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
30430 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
30440 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
30450 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
30460 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
30470 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
30480 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
30490 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
304a0 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
304b0 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
304c0 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
304d0 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
304e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
304f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
30500 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
30510 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
30520 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
30530 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
30540 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
30550 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
30560 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
30570 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
30580 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
305a0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
305b0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
305c0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305e0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
305f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
30600 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
30610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30620 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
30630 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
30640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30650 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
30660 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
30670 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
30680 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
30690 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
306a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
306b0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
306c0 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72  .  /* This error
306d0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
306e0 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
306f0 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
30700 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
30710 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
30720 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30730 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30740 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
30750 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
30760 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
30770 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
30780 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
30790 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
307a0 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
307b0 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
307c0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
307d0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
307e0 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
307f0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
30800 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
30810 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
30820 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
30830 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
30840 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
30850 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
30860 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
30870 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
30880 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
30890 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f  ell = pPage->apO
308a0 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20  vfl[0];.    u16 
308b0 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
308c0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
308d0 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
308e0 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
308f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30900 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
30910 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
30920 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
30930 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
30940 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
30950 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
30960 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
30970 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
30980 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
30990 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
309a0 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
309b0 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a  ell, &szCell);..
309c0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
309d0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
309e0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
309f0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
30a00 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
30a10 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
30a20 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
30a30 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
30a40 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
30a50 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
30a60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
30a70 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
30a80 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
30a90 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
30aa0 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
30ab0 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
30ac0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
30ad0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
30ae0 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
30af0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
30b00 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
30b10 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
30b20 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
30b30 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
30b40 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
30b50 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
30b60 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
30b70 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
30b80 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
30b90 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
30ba0 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
30bb0 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
30bc0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
30bd0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
30be0 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
30bf0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
30c00 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
30c10 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
30c20 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
30c30 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
30c40 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
30c50 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
30c60 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
30c70 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
30c80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
30c90 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
30ca0 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
30cb0 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
30cc0 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
30cd0 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
30ce0 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
30cf0 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
30d00 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
30d10 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
30d20 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
30d30 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
30d40 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
30d50 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
30d60 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
30d70 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
30d80 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
30d90 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
30da0 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
30db0 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
30dc0 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
30dd0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
30de0 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
30df0 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
30e00 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
30e10 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
30e20 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
30e30 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
30e40 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
30e50 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
30e60 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
30e70 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
30e80 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
30e90 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
30ea0 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
30eb0 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
30ec0 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
30ed0 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
30ee0 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
30ef0 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
30f00 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
30f10 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
30f20 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
30f30 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
30f40 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
30f50 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
30f60 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
30f70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
30f80 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
30f90 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
30fa0 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
30fb0 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
30fc0 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
30fd0 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
30fe0 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
30ff0 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
31000 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
31010 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
31020 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
31030 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
31040 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
31050 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
31060 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
31070 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
31080 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
31090 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
310a0 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
310b0 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
310c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
310d0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
310e0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
310f0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
31100 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
31110 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
31120 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
31130 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
31140 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
31150 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
31160 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
31170 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
31180 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
31190 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
311a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
311b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
311c0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
311d0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
311e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
311f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
31200 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
31210 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
31220 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
31230 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
31240 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
31250 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
31260 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
31270 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
31280 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
31290 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
312a0 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
312b0 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
312c0 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
312d0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
312e0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
312f0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
31300 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
31310 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
31320 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
31330 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
31340 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
31350 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
31360 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
31370 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
31380 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
31390 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
313a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
313b0 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
313c0 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
313d0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
313e0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
313f0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
31400 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
31410 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
31420 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
31430 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
31440 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
31450 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
31460 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
31470 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
31480 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
31490 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
314a0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
314b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
314c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
314d0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
314e0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
314f0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
31500 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
31510 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
31520 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
31530 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
31540 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
31550 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
31560 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
31570 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31580 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
31590 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
315a0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
315b0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
315c0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
315d0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
315e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
315f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
31600 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
31610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
31620 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
31630 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31640 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
31650 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
31660 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
31670 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
31680 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
31690 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
316a0 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
316b0 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
316c0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
316d0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
316e0 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
316f0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
31700 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
31710 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
31720 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
31730 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
31740 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
31750 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
31760 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
31770 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
31780 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
31790 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
317a0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
317b0 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
317c0 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
317d0 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
317e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
317f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
31800 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
31810 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
31820 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
31830 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72  Page.apOvfl[] ar
31840 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
31850 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
31860 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
31870 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
31880 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
31890 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
318a0 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
318b0 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
318c0 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
318d0 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
318e0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
318f0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
31900 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
31910 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
31920 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
31930 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
31940 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
31950 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
31960 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
31970 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
31980 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
31990 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
319a0 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
319b0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
319c0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
319d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
319e0 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
319f0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
31a00 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
31a10 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
31a20 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
31a30 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
31a40 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
31a50 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
31a60 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
31a70 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
31a80 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
31a90 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
31aa0 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
31ab0 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
31ac0 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
31ad0 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
31ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
31af0 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
31b00 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
31b10 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
31b20 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
31b30 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
31b40 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
31b50 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
31b60 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
31b70 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
31b80 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
31b90 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
31ba0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
31bb0 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
31bc0 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
31bd0 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
31be0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
31bf0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
31c00 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
31c10 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
31c20 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
31c30 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
31c40 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
31c50 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
31c60 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
31c70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31c80 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
31c90 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
31ca0 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
31cb0 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
31cc0 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
31cd0 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
31ce0 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
31cf0 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
31d00 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
31d10 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
31d20 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
31d30 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
31d40 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
31d50 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
31d60 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
31d70 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
31d80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
31da0 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
31db0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
31dc0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
31dd0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
31de0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
31df0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31e00 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
31e10 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
31e20 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
31e30 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
31e40 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
31e50 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
31e60 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
31e70 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
31e80 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
31e90 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
31ea0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
31eb0 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
31ec0 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
31ed0 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
31ee0 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
31ef0 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
31f00 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
31f10 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
31f20 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
31f30 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
31f40 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
31f50 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
31f60 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
31f70 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
31f80 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
31f90 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
31fa0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
31fb0 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
31fc0 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
31fd0 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
31fe0 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
31ff0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
32000 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
32010 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
32020 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
32030 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
32040 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
32050 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
32060 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
32070 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
32080 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
32090 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
320a0 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
320b0 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
320c0 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
320d0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
320e0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
320f0 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
32100 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
32110 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
32120 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
32130 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
32140 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
32150 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
32160 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
32170 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
32180 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
32190 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
321a0 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
321b0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
321c0 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
321d0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
321e0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
321f0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
32200 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
32210 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
32220 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
32230 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
32240 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
32250 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
32260 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
32270 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
32280 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
32290 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
322a0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
322b0 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
322c0 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
322d0 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
322e0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
322f0 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
32300 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32310 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
32320 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
32330 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32340 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
32350 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
32360 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
32370 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
32380 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
32390 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
323a0 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
323b0 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
323c0 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
323d0 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
323e0 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
323f0 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
32400 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
32410 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
32420 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
32430 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
32440 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
32450 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
32460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
32470 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
32480 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
32490 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
324a0 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
324b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
324c0 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
324d0 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
324e0 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62  to a.** buffer b
324f0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
32500 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77  d one page. If w
32510 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63  hile inserting c
32520 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
32530 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50  rent.** page (pP
32540 61 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e  arent) the paren
32550 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
32560 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
32570 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
32580 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
32590 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63  ent's overflow c
325a0 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68  ells. Because th
325b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65  is function inse
325c0 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d  rts.** a maximum
325d0 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72   of four divider
325e0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
325f0 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64  parent page, and
32600 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
32610 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73  size of a cell s
32620 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20  tored within an 
32630 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
32640 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61   always less tha
32650 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20  n 1/4.** of the 
32660 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61  page-size, the a
32670 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66  OvflSpace[] buff
32680 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
32690 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
326a0 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f  enough for all o
326b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
326c0 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61  *.** If aOvflSpa
326d0 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ce is set to a n
326e0 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ull pointer, thi
326f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
32700 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ns .** SQLITE_NO
32710 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  MEM..*/.#if defi
32720 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
32730 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30   _MSC_VER >= 170
32740 30 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f  0 && defined(_M_
32750 41 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74  ARM).#pragma opt
32760 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23  imize("", off).#
32770 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
32780 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
32790 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
327a0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
327b0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
327c0 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
327d0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
327e0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
327f0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
32800 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
32810 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
32820 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
32830 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
32840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
32850 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
32860 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
32870 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
32880 73 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  sRoot,          
32890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
328a0 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
328b0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
328c0 20 20 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20    int bBulk     
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
328f0 73 20 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f  s call is part o
32900 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f  f a bulk load */
32910 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
32920 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
32930 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
32940 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
32950 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  t nCell = 0;    
32960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32970 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
32980 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69   apCell[] */.  i
32990 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30  nt nMaxCells = 0
329a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
329b0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
329c0 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c   apCell, szCell,
329d0 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74   aFrom. */.  int
329e0 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20   nNew = 0;      
329f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32a00 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
32a10 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apNew[] */.  int
32a20 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   nOld;          
32a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32a40 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
32a50 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apOld[] */.  int
32a60 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20   i, j, k;       
32a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
32a80 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
32a90 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32ab0 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
32ac0 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
32ad0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
32ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
32af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
32b00 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
32b10 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69  u16 leafCorrecti
32b20 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
32b30 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
32b40 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
32b50 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
32b60 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
32b70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
32b80 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
32b90 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
32ba0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
32bb0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
32bc0 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
32bd0 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
32be0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
32bf0 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
32c00 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
32c10 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
32c20 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
32c30 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
32c40 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
32c50 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
32c60 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
32c70 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31  */.  int iSpace1
32c80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32c90 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
32ca0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
32cb0 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76  1[] */.  int iOv
32cc0 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20  flSpace = 0;    
32cd0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
32ce0 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f  nused byte of aO
32cf0 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20  vflSpace[] */.  
32d00 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32d20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
32d30 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
32d40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
32d50 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
32d60 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
32d70 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
32d80 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  gs */.  MemPage 
32d90 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20  *apCopy[NB];    
32da0 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20       /* Private 
32db0 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b  copies of apOld[
32dc0 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d  ] pages */.  Mem
32dd0 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32  Page *apNew[NB+2
32de0 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ];        /* pPa
32df0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20  ge and up to NB 
32e00 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62  siblings after b
32e10 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38  alancing */.  u8
32e20 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20   *pRight;       
32e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
32e40 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74  cation in parent
32e50 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e   of right-siblin
32e60 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  g pointer */.  u
32e70 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20  8 *apDiv[NB-1]; 
32e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
32e90 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
32ea0 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
32eb0 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
32ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
32ed0 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
32ee0 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
32ef0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
32f00 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
32f10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
32f20 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
32f30 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
32f40 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
32f50 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
32f60 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
32f70 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
32f80 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
32f90 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
32fa0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
32fb0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
32fc0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
32fd0 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ff0 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
33000 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
33010 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  lls */.  Pgno pg
33020 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
33030 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61        /* Temp va
33040 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67  r to store a pag
33050 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a  e number in */..
33060 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d    pBt = pParent-
33070 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
33080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33090 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
330a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
330b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
330c0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
330d0 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a  Page) );..#if 0.
330e0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
330f0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
33100 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
33110 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
33120 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23  arent->pgno));.#
33130 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74  endif..  /* At t
33140 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e  his point pParen
33150 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f  t may have at mo
33160 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20  st one overflow 
33170 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a  cell. And if.  *
33180 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  * this overflow 
33190 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c  cell is present,
331a0 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   it must be the 
331b0 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20  cell with .  ** 
331c0 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78  index iParentIdx
331d0 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20  . This scenario 
331e0 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e  comes about when
331f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
33200 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69   ** is called (i
33210 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20  ndirectly) from 
33220 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
33230 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  te()..  */.  ass
33240 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
33250 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
33260 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33270 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
33280 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
33290 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
332a0 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50  t->aiOvfl[0]==iP
332b0 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
332c0 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
332d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
332e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
332f0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
33300 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
33310 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
33320 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
33330 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
33340 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
33350 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
33360 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
33370 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
33380 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
33390 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
333a0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
333b0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
333c0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
333d0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
333e0 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
333f0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
33400 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
33410 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
33420 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
33430 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
33440 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
33450 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
33460 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
33470 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
33480 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
33490 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
334a0 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
334b0 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
334c0 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
334d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
334e0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
334f0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
33500 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
33510 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
33520 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
33530 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
33540 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
33550 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
33560 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
33570 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
33580 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
33590 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
335a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
335b0 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d    assert( bBulk=
335c0 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29  =0 || bBulk==1 )
335d0 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e  ;.    if( iParen
335e0 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20  tIdx==0 ){      
335f0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
33600 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
33610 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65   }else if( iPare
33620 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20  ntIdx==i ){.    
33630 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42    nxDiv = i-2+bB
33640 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ulk;.    }else{.
33650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42        assert( bB
33660 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ulk==0 );.      
33670 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49  nxDiv = iParentI
33680 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dx-1;.    }.    
33690 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d  i = 2-bBulk;.  }
336a0 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20  .  nOld = i+1;. 
336b0 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50   if( (i+nxDiv-pP
336c0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
336d0 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  )==pParent->nCel
336e0 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20  l ){.    pRight 
336f0 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  = &pParent->aDat
33700 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
33710 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65  fset+8];.  }else
33720 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66  {.    pRight = f
33730 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
33740 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
33750 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
33760 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62  }.  pgno = get4b
33770 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77  yte(pRight);.  w
33780 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72  hile( 1 ){.    r
33790 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
337a0 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61  ge(pBt, pgno, &a
337b0 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20  pOld[i], 0);.   
337c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
337d0 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
337e0 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
337f0 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
33800 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
33810 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
33820 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
33830 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
33840 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
33850 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
33860 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
33870 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d      if( i+nxDiv=
33880 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c  =pParent->aiOvfl
33890 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  [0] && pParent->
338a0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
338b0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
338c0 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d  arent->apOvfl[0]
338d0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
338e0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
338f0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
33900 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
33910 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
33920 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ]);.      pParen
33930 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  t->nOverflow = 0
33940 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33950 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
33960 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
33970 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
33980 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >nOverflow);.   
33990 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
339a0 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
339b0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
339c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
339d0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a  nt, apDiv[i]);..
339e0 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68        /* Drop th
339f0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
33a00 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44  parent page. apD
33a10 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e  iv[i] still poin
33a20 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  ts to.      ** t
33a30 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74  he cell within t
33a40 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20  he parent, even 
33a50 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
33a60 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20  en dropped..    
33a70 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66    ** This is saf
33a80 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69  e because droppi
33a90 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f  ng a cell only o
33aa0 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69  verwrites the fi
33ab0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
33ac0 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61  r bytes of it, a
33ad0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
33ae0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
33af0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
33b00 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
33b10 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
33b20 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  . So the pointer
33b30 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a   is safe to use.
33b40 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f        ** later o
33b50 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n.  .      **.  
33b60 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69      ** But not i
33b70 66 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75  f we are in secu
33b80 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
33b90 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  In secure-delete
33ba0 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   mode,.      ** 
33bb0 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
33bc0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
33bd0 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
33be0 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
33bf0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
33c00 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
33c10 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
33c20 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
33c30 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
33c40 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
33c50 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
33c60 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
33c70 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
33c80 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
33c90 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
33ca0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
33cb0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
33cc0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
33cd0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
33ce0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ;..        iOff 
33cf0 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
33d00 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20  INT(apDiv[i]) - 
33d10 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
33d20 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  T(pParent->aData
33d30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
33d40 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28  iOff+szNew[i])>(
33d50 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
33d60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
33d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33d80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
33d90 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
33da0 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
33db0 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
33dc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
33dd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33de0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
33df0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
33e00 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d  aOvflSpace[iOff]
33e10 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
33e20 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  w[i]);.         
33e30 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
33e40 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
33e50 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
33e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33e70 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65    }.      dropCe
33e80 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
33e90 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33ea0 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
33eb0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
33ec0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
33ed0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
33ee0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
33ef0 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
33f00 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
33f10 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
33f20 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
33f30 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
33f40 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
33f50 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
33f60 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
33f70 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
33f80 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
33f90 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
33fa0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
33fb0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
33fc0 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
33fe0 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
33ff0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
34000 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
34010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
34020 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
34030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
34040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
34060 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
34070 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
340a0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
340b0 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
340c0 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
340d0 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
340e0 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
340f0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
34100 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
34110 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
34120 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
34130 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
34140 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
34150 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
34160 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
34170 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
34180 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
34190 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
341a0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
341b0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
341c0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
341d0 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
341e0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
341f0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
34200 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
34210 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
34220 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
34230 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
34240 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
34250 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
34260 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69  nd remove the di
34270 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
34280 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
34290 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
342a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
342b0 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
342c0 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
342d0 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
342e0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
342f0 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
34300 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
34310 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
34320 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
34330 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
34340 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
34350 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
34360 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
34370 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
34380 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
34390 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
343a0 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
343b0 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
343c0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
343d0 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
343e0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
343f0 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
34400 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
34410 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
34420 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
34430 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
34440 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
34450 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
34460 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
34470 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
34480 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
34490 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
344a0 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
344b0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
344c0 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
344d0 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
344e0 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
344f0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
34500 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
34510 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
34520 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
34530 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
34540 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
34550 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
34560 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
34570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
34580 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
34590 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
345a0 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
345b0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
345c0 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
345d0 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
345e0 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
345f0 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
34600 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
34610 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
34620 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
34630 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
34640 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
34650 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
34660 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
34670 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
34680 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
34690 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
346a0 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
346b0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
346c0 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
346d0 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
346e0 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
346f0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
34700 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
34710 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
34720 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
34730 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
34740 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
34750 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
34760 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
34770 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
34780 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
34790 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
347a0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
347b0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
347c0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
347d0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
347e0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
347f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
34800 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
34810 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
34820 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
34830 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
34840 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
34850 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
34860 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
34870 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
34880 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
34890 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
348a0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
348b0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
348c0 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
348d0 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
348e0 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
348f0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
34900 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
34910 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
34920 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
34930 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
34940 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
34950 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
34960 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
34970 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
34980 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
34990 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
349a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
349b0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
349c0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
349d0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
349e0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
349f0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
34a00 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
34a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
34a20 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
34a30 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
34a40 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
34a50 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
34a60 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
34a70 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
34a80 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
34a90 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
34aa0 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
34ab0 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
34ac0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
34ad0 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
34ae0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
34af0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
34b00 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
34b10 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
34b20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
34b30 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
34b40 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
34b50 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
34b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34b70 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
34b80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
34b90 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
34ba0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
34bb0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
34bc0 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
34bd0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
34be0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
34bf0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
34c00 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
34c10 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
34c20 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
34c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
34c40 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
34c50 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
34c60 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
34c70 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
34c80 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
34c90 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
34ca0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
34cb0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
34cc0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34cd0 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
34ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
34cf0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
34d00 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
34d10 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
34d20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
34d30 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
34d40 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
34d50 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
34d60 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
34d70 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
34d80 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
34d90 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
34da0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
34db0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
34dc0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
34dd0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
34de0 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
34df0 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
34e00 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
34e10 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
34e20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
34e30 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
34e40 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
34e50 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
34e60 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
34e70 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
34e80 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
34e90 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
34ea0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
34eb0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
34ec0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
34ed0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
34ee0 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
34ef0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
34f00 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
34f10 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
34f20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34f30 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
34f40 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
34f50 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
34f60 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
34f70 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
34f80 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
34f90 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
34fa0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
34fb0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
34fc0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
34fd0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
34fe0 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
34ff0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
35000 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
35010 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35020 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
35030 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
35040 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
35050 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
35060 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
35070 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
35080 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
35090 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
350a0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
350b0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
350c0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
350d0 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
350e0 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
350f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35100 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
35110 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
35120 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
35130 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
35140 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
35150 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
35160 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
35170 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
35180 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
35190 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
351a0 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
351b0 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
351c0 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
351d0 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
351e0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
351f0 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
35200 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
35210 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
35220 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
35230 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
35240 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
35250 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
35260 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
35270 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
35280 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
35290 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
352a0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
352b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
352c0 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
352d0 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
352e0 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
352f0 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
35300 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
35310 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
35320 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
35330 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
35340 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
35350 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
35360 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
35370 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
35380 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
35390 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
353a0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
353b0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
353c0 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
353d0 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
353e0 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
353f0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
35400 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
35410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35420 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
35430 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
35440 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
35450 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
35460 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
35470 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
35480 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
35490 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
354a0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
354b0 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
354c0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
354d0 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
354e0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
354f0 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
35500 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
35510 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20  szRight==0 .    
35520 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26     || (!bBulk &&
35530 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
35540 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
35550 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20  Cell[r]+2)) .   
35560 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
35570 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
35580 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
35590 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
355a0 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
355b0 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
355c0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
355d0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
355e0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
355f0 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
35600 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
35610 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
35620 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
35630 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
35640 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
35650 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
35660 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
35670 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
35680 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
35690 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
356a0 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
356b0 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
356c0 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
356d0 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
356e0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
356f0 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20  **.  ** UPDATE: 
35700 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
35710 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  low is not neces
35720 73 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74  sarily true if t
35730 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
35740 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
35750 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f  .  The corruptio
35760 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74  n will be detect
35770 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ed and reported 
35780 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68  later.  ** in th
35790 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20  is procedure so 
357a0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
357b0 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20   to act upon it 
357c0 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  now..  */.#if 0.
357d0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
357e0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
357f0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
35800 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
35810 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52   );.#endif..  TR
35820 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
35830 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
35840 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
35850 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
35860 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
35870 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
35880 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
35890 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
358a0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
358b0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
358c0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
358d0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
358e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
358f0 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
35900 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
35910 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35920 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
35930 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
35940 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
35950 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
35960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
35970 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
35980 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
35990 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
359a0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
359b0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
359c0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
359d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
359e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
359f0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
35a00 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
35a10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
35a20 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35a40 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
35a50 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
35a60 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
35a70 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
35a80 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e  (bBulk ? 1 : pgn
35a90 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  o), 0);.      if
35aa0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
35ab0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
35ac0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
35ad0 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
35ae0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
35af0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
35b00 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
35b10 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
35b20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
35b30 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
35b40 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
35b50 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
35b60 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
35b70 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
35b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
35b90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
35bb0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35bd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
35be0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
35bf0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
35c00 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
35c10 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
35c20 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
35c30 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
35c40 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
35c50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
35c60 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35c70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35c80 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
35c90 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
35ca0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
35cb0 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
35cc0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
35cd0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
35ce0 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
35cf0 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
35d00 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
35d10 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
35d20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
35d30 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
35d40 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
35d50 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
35d60 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
35d70 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
35d80 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
35d90 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
35da0 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
35db0 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
35dc0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
35dd0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
35de0 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
35df0 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
35e00 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
35e10 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
35e20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
35e30 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
35e40 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
35e50 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
35e60 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
35e70 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
35e80 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
35e90 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
35ea0 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
35eb0 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
35ec0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
35ed0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
35ee0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
35ef0 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
35f00 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
35f10 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
35f20 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
35f30 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
35f40 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
35f50 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
35f60 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
35f70 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
35f80 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
35f90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35fa0 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
35fb0 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
35fc0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
35fd0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
35fe0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
35ff0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
36000 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
36010 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
36020 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
36030 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
36040 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
36050 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
36060 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
36070 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
36080 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
36090 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
360a0 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
360b0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
360c0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
360d0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
360e0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
360f0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
36100 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
36110 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
36120 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
36130 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
36140 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
36150 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
36160 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36170 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
36180 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
36190 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
361a0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
361b0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
361c0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
361d0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
361e0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
361f0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
36200 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
36210 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
36220 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
36230 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
36240 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
36250 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
36260 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
36270 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
36280 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
36290 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
362a0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
362b0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
362c0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
362d0 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
362e0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
362f0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
36300 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
36310 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
36320 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
36330 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
36340 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
36350 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
36360 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
36370 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
36380 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
36390 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
363a0 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
363b0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
363c0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
363d0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
363e0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
363f0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
36400 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
36410 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
36420 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
36430 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
36440 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
36450 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
36460 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
36470 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
36480 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
36490 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
364a0 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
364b0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
364c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
364d0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
364e0 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
364f0 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
36500 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
36510 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
36520 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
36530 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
36540 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
36550 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
36560 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
36570 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
36580 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
36590 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
365a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
365b0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
365c0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
365d0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
365e0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
365f0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
36600 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
36610 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
36620 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
36630 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
36640 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
36650 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
36660 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
36670 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
36680 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
36690 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
366a0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
366b0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
366c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
366d0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
366e0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
366f0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
36700 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
36710 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
36720 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
36730 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
36740 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
36750 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
36760 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
36770 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
36780 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
36790 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
367a0 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
367b0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
367c0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
367d0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
367e0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
367f0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
36800 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
36810 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
36820 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
36830 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
36840 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
36850 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
36860 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
36870 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
36880 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
36890 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
368a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
368b0 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
368c0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
368d0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
368e0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
368f0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
36900 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
36910 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
36920 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
36930 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
36940 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
36950 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
36960 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
36970 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
36980 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
36990 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
369a0 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
369b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
369c0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
369d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
369e0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
369f0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
36a00 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
36a10 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
36a20 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
36a30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
36a40 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
36a50 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
36a60 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
36a70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
36a80 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20  ( iOvflSpace <= 
36a90 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
36aa0 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
36ab0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
36ac0 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
36ad0 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
36ae0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
36af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36b00 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
36b10 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
36b20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36b30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36b40 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
36b50 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
36b60 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
36b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
36b80 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
36b90 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
36ba0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
36bb0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
36bc0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
36bd0 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
36be0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
36bf0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
36c00 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
36c10 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
36c20 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
36c30 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
36c40 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
36c50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
36c60 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
36c70 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
36c80 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
36c90 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
36ca0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
36cb0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
36cc0 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
36cd0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
36ce0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
36cf0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
36d00 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
36d10 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
36d20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
36d30 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
36d40 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
36d50 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
36d60 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
36d70 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
36d80 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
36d90 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
36da0 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
36db0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
36dc0 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
36dd0 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
36de0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
36df0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
36e00 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
36e10 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
36e20 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
36e30 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
36e40 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
36e50 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
36e60 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
36e70 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
36e80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
36e90 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
36ea0 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
36eb0 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
36ec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
36ed0 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
36ee0 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
36ef0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
36f00 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
36f10 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
36f20 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
36f30 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
36f40 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
36f50 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
36f60 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
36f70 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
36f80 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
36f90 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
36fa0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
36fb0 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
36fc0 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
36fd0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
36fe0 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
36ff0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
37000 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
37010 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
37020 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
37030 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
37040 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
37050 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
37060 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
37070 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
37080 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
37090 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
370a0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
370b0 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
370c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
370d0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
370e0 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
370f0 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
37100 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
37110 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
37120 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
37130 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
37140 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
37150 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
37160 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
37170 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
37180 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
37190 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
371a0 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
371b0 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
371c0 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
371d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
371e0 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
371f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37200 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
37210 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
37220 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
37230 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
37240 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
37250 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
37260 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
37270 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
37280 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
37290 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
372a0 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
372b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
372c0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
372d0 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
372e0 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
372f0 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
37300 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
37310 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
37320 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
37330 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
37340 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
37350 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
37360 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
37370 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
37380 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
37390 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
373a0 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
373b0 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
373c0 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
373d0 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
373e0 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
373f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37400 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
37410 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
37420 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
37430 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
37440 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
37450 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
37460 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
37470 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
37480 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
37490 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
374a0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
374b0 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
374c0 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
374d0 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
374e0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
374f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
37500 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
37510 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
37520 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
37530 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
37540 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
37550 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
37560 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
37570 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
37580 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
37590 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
375a0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
375b0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
375c0 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
375d0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
375e0 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
375f0 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
37600 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
37610 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
37620 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
37630 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
37640 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
37650 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
37660 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
37670 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
37680 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
37690 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
376a0 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
376b0 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
376c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
376d0 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
376e0 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
376f0 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
37700 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
37710 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
37720 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
37730 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
37740 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
37750 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
37760 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
37770 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
37780 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
37790 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
377a0 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
377b0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
377c0 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
377d0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
377e0 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
377f0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
37800 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
37810 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
37820 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  ow ? pOld->aiOvf
37830 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20  l[0] : -1);.    
37840 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
37870 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
37880 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
378b0 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
378c0 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
378d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
378e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
378f0 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
37900 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
37910 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
37920 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
37930 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
37940 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
37950 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
37960 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
37970 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
37980 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
37990 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
379a0 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
379b0 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
379c0 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
379d0 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
379e0 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
379f0 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72  ssert( j+1 < Arr
37a00 61 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29  aySize(apCopy) )
37a10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37a20 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a  ( j+1 < nOld );.
37a30 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61          pOld = a
37a40 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  pCopy[++j];.    
37a50 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69      iNextOld = i
37a60 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
37a70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c  Old->nCell + pOl
37a80 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
37a90 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
37aa0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
37ab0 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77         nOverflow
37ac0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
37ad0 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ow;.          iO
37ae0 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c  verflow = i + !l
37af0 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
37b00 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  aiOvfl[0];.     
37b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
37b20 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
37b30 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
37b40 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
37b50 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
37b60 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
37b70 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
37b80 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76  <2 || pOld->aiOv
37b90 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f  fl[0]==pOld->aiO
37ba0 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20  vfl[1]-1);.     
37bb0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
37bc0 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f  w<3 || pOld->aiO
37bd0 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69  vfl[1]==pOld->ai
37be0 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20  Ovfl[2]-1);.    
37bf0 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
37c00 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
37c10 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
37c20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
37c30 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
37c40 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
37c50 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
37c60 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
37c70 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
37c80 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
37c90 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
37ca0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
37cb0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
37cc0 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
37cd0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
37ce0 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
37cf0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
37d00 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
37d10 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
37d20 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
37d30 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
37d40 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
37d50 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
37d60 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
37d70 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
37d80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
37d90 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
37da0 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
37db0 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
37dc0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37dd0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
37de0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
37df0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
37e00 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
37e10 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
37e20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
37e30 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
37e40 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
37e50 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
37e60 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
37e70 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
37e80 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
37e90 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
37ea0 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
37eb0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
37ec0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
37ed0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
37ee0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
37ef0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
37f00 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
37f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
37f20 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
37f30 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
37f40 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
37f50 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
37f60 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
37f70 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
37f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37f90 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
37fa0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
37fb0 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
37fc0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
37fd0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
37fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37ff0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
38000 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
38010 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
38020 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
38030 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
38040 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
38050 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
38060 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
38070 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
38080 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
38090 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
380a0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
380b0 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
380c0 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
380d0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
380e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
380f0 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
38100 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
38110 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
38120 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
38130 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
38140 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
38150 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
38160 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
38170 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
38180 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
38190 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
381a0 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
381b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
381c0 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
381d0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
381e0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
381f0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
38200 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
38210 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
38220 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
38230 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
38240 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
38250 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
38260 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
38270 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
38280 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
38290 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
382a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
382b0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
382c0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
382d0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
382e0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
382f0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
38300 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
38310 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
38320 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
38330 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
38340 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
38350 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
38360 63 3b 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  c;.}.#if defined
38370 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
38380 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
38390 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
383a0 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
383b0 7a 65 28 22 22 2c 20 6f 6e 29 0a 23 65 6e 64 69  ze("", on).#endi
383c0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f.../*.** This f
383d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
383e0 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
383f0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
38400 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
38410 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
38420 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
38430 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
38440 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
38450 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
38460 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
38470 20 6f 66 20 74 68 65 20 63 75