/ Hex Artifact Content
Login

Artifact 771f0391556317de19e02c9533b256e8299dd59b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4d10: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4d20: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4d30: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4d40: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4d50: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4d60: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4d70: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4d80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4d90: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4da0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4db0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4dc0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4dd0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4de0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4e00: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4e10: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4e20: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4e30: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4e40: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4e50: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4e60: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4e70: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4e90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4ea0: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4ec0: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4ed0: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4f00: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4f10: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4f20: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4f30: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4f40: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4f50: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4f60: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4f70: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4f90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4fa0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4fb0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4fc0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4fd0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4fe0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ff0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5000: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
5010: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
5020: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
5030: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
5040: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
5050: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
5060: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
5070: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5080: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
5090: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
50a0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
50b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
50c0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
50d0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
50e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
50f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5100: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5110: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5120: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5130: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
5140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5150: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5170: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5180: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5190: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
51a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
51e0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
51f0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
5200: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
5210: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
5220: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
5230: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
5240: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5250: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5260: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5270: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5280: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5290: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
52a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
52b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
52c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
52d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
52e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
52f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5300: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5310: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
5320: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
5330: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5340: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5350: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5360: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5370: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5380: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5390: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
53a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
53b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
53c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
53d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
53e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
5420: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
5430: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
5440: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5450: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5460: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5470: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5480: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5490: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
54a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
54b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
54c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
54d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
54e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
54f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5550: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5560: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5580: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5590: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
55a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
55b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
55c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55d0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
55e0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
55f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5600: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5610: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5620: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5630: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5640: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5650: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5660: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5670: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5680: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5690: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
56a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
56b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
56c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
56d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
56f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5700: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5710: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5720: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5730: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5740: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5750: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5760: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5770: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5790: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
57a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
57b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
57c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
57d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
57e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
57f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5800: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5810: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5820: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5860: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5870: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5880: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5890: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
58a0: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
58b0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
58c0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
58d0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
58e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
58f0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5900: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5910: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5920: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5930: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5940: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5950: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5960: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5970: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5980: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5990: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
59a0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
59b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
59d0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
59e0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
59f0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5a00: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
5a10: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5a20: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a30: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5a40: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5a50: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5a60: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5a70: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5a80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5a90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5aa0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5ab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5ac0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5ad0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5ae0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5af0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5b00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5b10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5b20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5b30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
5b40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5b50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5b60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5b70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5b80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5b90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5ba0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5bb0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5bc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5bd0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5be0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bf0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5c00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5c20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5c40: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5c50: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5c60: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5c70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c80: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5c90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5ca0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5cc0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5ce0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5cf0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5d00: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5d10: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5d20: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5d30: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5d60: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5d70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5d80: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5d90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5da0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5db0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5dc0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5dd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5de0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5df0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5e00: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5e10: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5e20: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5e30: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5e40: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5e50: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e60: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5e70: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5e80: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5e90: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5eb0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5ec0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5ed0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5ee0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5ef0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5f00: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5f10: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5f30: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5f40: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5f50: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5f60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5f70: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5f80: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5f90: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5fa0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5fb0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5fc0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5fd0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5fe0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ff0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6000: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6010: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
6020: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
6030: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
6040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6050: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6060: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6070: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
6080: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
6090: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
60a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
60b0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
60c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
60e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
60f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6100: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6110: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6120: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6130: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6140: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6150: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6160: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6170: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6180: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6190: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
61a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
61b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
61c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
61d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
61e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
61f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6200: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6210: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6220: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6230: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6240: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6250: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6270: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6280: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6290: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
62a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
62c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
62d0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
62e0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
62f0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6300: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6310: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6320: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6330: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6340: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6350: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6360: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6370: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6380: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
63a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
63b0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
63c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
63d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
63e0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
63f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6400: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6410: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6420: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6430: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6440: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6450: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6460: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6470: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6480: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6490: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
64a0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
64d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
64e0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
64f0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6500: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6510: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6520: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6530: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6540: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6550: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6560: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6570: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6580: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6590: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
65a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
65b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
65c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
65e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
65f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6600: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6610: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6630: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6640: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6650: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6660: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6680: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6690: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
66a0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
66b0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
66c0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
66d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
66e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
66f0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6700: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6710: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6720: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6730: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6740: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6750: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6760: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6780: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6790: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
67a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
67b0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
67c0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
67d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67f0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6800: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6810: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6820: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6830: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6840: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6850: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6860: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6870: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6890: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
68a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
68b0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
68c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
68d0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
68e0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
68f0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6900: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6910: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6920: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6930: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6940: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6950: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6960: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6970: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6980: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
69a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
69b0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
69c0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
69d0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
69e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
69f0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6a00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6a10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6a20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6a40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6a50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6a80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6a90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6aa0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ab0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6ad0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6ae0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6af0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6b00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6b10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6b20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6b30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6b40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6b50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6b70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6b80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6b90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6bb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6bc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6bd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6be0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6bf0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6c00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6c10: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6c20: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6c30: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6c40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6c50: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6c70: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6c80: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6c90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6ca0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6cc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6cd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6ce0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d00: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6d10: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6d20: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6d30: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6d40: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6d50: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6d60: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6d70: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6d80: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6d90: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6db0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6dc0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6dd0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6de0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6df0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6e00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6e10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6e20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6e30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6e40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6e50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6e60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6e80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6ea0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ec0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6ed0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6ee0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f00: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6f10: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f20: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6f30: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6f40: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6f50: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6f70: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6f80: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6f90: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6fa0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6fb0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6fc0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6fd0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ff0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7000: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7010: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7020: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7030: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7040: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7050: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7060: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
7070: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
7080: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
7090: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
70a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
70b0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
70c0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
70d0: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
70e0: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
70f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7100: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7110: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7120: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7130: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7140: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7150: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7160: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7170: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7180: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7190: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
71a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
71b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
71c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
71d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
71e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
71f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7200: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7210: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7220: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7230: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7240: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7250: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7260: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7270: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7290: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
72a0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
72b0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
72c0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
72d0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
72f0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7300: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7320: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7330: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7340: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7350: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7390: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
73a0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
73b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
73c0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
73d0: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
73e0: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
73f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7410: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7420: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7430: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7460: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
74a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
74b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
74c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
74d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
74e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
74f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7510: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7530: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7540: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7550: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7560: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7570: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7580: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
75a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
75b0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
75c0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
75d0: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
75e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
75f0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7600: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7610: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7620: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7630: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7640: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7650: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7660: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7670: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7680: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7690: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
76a0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
76b0: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
76c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
76d0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
76e0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
76f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7700: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7710: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7720: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
7730: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
7740: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7750: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7760: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7770: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7780: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7790: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
77a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
77b0: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
77c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
77d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
77e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
77f0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7800: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7810: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7820: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
7830: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
7840: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7850: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7860: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7870: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7880: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7890: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
78a0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
78b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
78c0: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
78d0: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
78e0: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
78f0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7900: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7910: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7920: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7930: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7950: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7960: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7980: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7990: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
79a0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
79b0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
79c0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
79d0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
79e0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
79f0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7a00: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7a10: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7a20: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7a30: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7a40: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7a50: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7a60: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7a70: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7a80: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7a90: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7aa0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7ab0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7ac0: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7ad0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7ae0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7af0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7b00: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7b20: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7b30: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7b40: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b50: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7b60: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7b70: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7b80: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b90: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7ba0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7bb0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7bc0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7bd0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7be0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7bf0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7c00: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7c10: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7c20: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7c30: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7c40: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7c50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7c60: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7c70: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7c80: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7c90: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7ca0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7cb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7cc0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7cd0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7ce0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7cf0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7d00: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7d20: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7d30: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d40: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7d50: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7d70: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d80: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7d90: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7da0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7db0: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7dc0: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7dd0: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7de0: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7df0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7e00: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e10: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7e20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7e30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7e40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7e50: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7e70: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7e80: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7e90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7eb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7ec0: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7ed0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7ee0: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7ef0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7f00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7f10: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7f20: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7f30: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7f40: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7f50: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7f60: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7f70: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7f80: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7f90: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7fa0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7fb0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7fc0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7fd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ff0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8010: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8020: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
8030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8040: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
8050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8070: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8090: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
80a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
80b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
80c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
80d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
80e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
80f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8100: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8110: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8120: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8130: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8140: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8150: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8160: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8170: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8180: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8190: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
81a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
81b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
81c0: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
81d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
81e0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
81f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8200: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
8240: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8250: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8260: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8270: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8280: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8290: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
82a0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
82b0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
82c0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
82d0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
82e0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
82f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8300: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8310: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8320: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
8330: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
8340: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8360: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8370: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8380: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8390: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
83a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
83b0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
83c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
83d0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
83e0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
83f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8400: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8410: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8420: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
8430: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
8440: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8450: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8460: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8470: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8480: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8490: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
84a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
84b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
84c0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
84d0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
84e0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
84f0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8500: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8510: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8520: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
8530: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
8540: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8550: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8560: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8570: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8580: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8590: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
85a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
85b0: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
85c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
85d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
85e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
85f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8600: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8610: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8620: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
8630: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
8640: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8650: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8660: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8670: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8680: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8690: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
86a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
86b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
86c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
86d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
86e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
86f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8700: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8710: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8720: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
8730: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
8740: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8750: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8760: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8770: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8780: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8790: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
87a0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
87b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
87c0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
87d0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
87e0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
87f0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8800: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8810: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8820: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
8830: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
8840: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8850: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8860: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8870: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8880: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8890: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
88a0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
88b0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
88c0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
88d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
88e0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
88f0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8900: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8910: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8920: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8930: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8940: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8950: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8960: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8970: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8980: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8990: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
89a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
89b0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
89c0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
89d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
89e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8a40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8a50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8a70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8a80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8a90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8ac0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ae0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8af0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8b00: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8b20: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8b30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8b70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b80: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8b90: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bb0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8bc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8bd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8c00: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8c10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8c20: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8c30: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8c40: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8c50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8c60: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8c80: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8c90: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8ca0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8cc0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8cd0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ce0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8d20: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8d30: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8d40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8d50: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d90: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8da0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8db0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8dc0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8dd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8e10: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8e20: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8e30: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8e40: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8e50: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8e60: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8e70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e80: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8e90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8ea0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8eb0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8ec0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8ed0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8ee0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8ef0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8f00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8f10: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8f20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8f30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8f40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8f50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8f60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8f70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8f90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8fa0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8fb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8fc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8fd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8fe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ff0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9010: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9020: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9030: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9040: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9050: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9060: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9070: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9080: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9090: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
90a0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
90b0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
90c0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
90d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
90f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9100: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9110: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9120: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9130: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9150: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9160: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9170: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9190: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
91a0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
91b0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
91f0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9200: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9210: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9250: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9260: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9270: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9280: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9290: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
92a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
92b0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
92c0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
92d0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
92e0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
92f0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9300: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9310: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9320: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9330: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9340: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9350: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9360: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9370: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9380: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9390: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
93a0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
93b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
93c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93f0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9400: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9410: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9430: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9460: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9470: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9480: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9490: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
94a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
94b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
94c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
94d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
94e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
94f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9500: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9510: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9520: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9530: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9540: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9550: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9560: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9570: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9580: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9590: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
95b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
95c0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
95d0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
95e0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
95f0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9600: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9610: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9620: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
9630: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
9640: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9650: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9660: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9670: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9680: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9690: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
96a0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
96b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
96c0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
96d0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
96f0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9710: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9720: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
9730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9740: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9750: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9770: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9780: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9790: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
97a0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
97b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
97c0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
97f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9800: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9810: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9840: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9850: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9860: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9870: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9880: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9890: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
98a0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
98c0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
98d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
98e0: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
98f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9900: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9910: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9920: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9930: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9950: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9980: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9990: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
99a0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
99b0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
99c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
99d0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
99e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
99f0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9a00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9a20: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9a30: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9a40: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9a50: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9a60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9a80: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9a90: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9aa0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ab0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9ac0: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9ad0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9ae0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9af0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9b00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b10: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9b20: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b40: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9b50: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9b60: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9b70: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9b80: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9b90: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9ba0: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9bb0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9bc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9bd0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9be0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9bf0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9c00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c10: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9c20: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9c30: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9c40: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9c50: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9c60: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9c70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9c80: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9c90: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9ca0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9cb0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9cc0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9cd0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9ce0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9d00: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9d10: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9d20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9d30: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9d40: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9d50: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9d60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9d70: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9d80: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9d90: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9da0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9dc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9de0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9df0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9e00: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9e10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9e20: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9e30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e40: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9e50: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9e70: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9e80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9e90: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9ea0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9eb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9ec0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9ed0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9ee0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9ef0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9f00: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9f10: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9f20: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9f30: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9f40: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9f50: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9f60: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9f70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9f80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9fb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9fc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9fd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9fe0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ff0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a000: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a010: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a020: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a030: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a040: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a060: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a0a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a0c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a0d0: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a0f0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a100: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a110: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a120: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a130: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a140: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a150: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a160: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a180: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a190: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a1a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a1b0: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a1c0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a1d0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a1e0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a1f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a200: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a210: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a230: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a240: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a250: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a260: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a270: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a280: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a290: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a2a0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a2b0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a2c0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a2e0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a2f0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a300: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a310: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a320: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a330: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a340: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a360: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a380: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a390: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a3a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a3c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a3e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a3f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a400: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a410: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a420: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a430: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a440: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a450: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a460: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a470: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a480: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a490: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a4a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a4b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a4c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a4d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a4e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a4f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a500: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a510: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a520: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a550: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a560: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a5a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a5b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a5c0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a5d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a5e0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a600: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a610: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a620: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a630: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a680: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a690: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a6a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a6b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a6c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a6d0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a6e0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a6f0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a700: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a710: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a720: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a730: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a740: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a760: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a770: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a780: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a790: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a7a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a7b0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a7c0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a7d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a7e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a7f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a800: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a810: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a820: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a830: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a840: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a850: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a860: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a870: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a880: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a890: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a8a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a8b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a8c0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a8d0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a8e0: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a8f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a900: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a910: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a920: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a930: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a940: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a950: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a960: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a970: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a980: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a9a0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a9c0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a9d0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a9e0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a9f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
aa00: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
aa10: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
aa20: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
aa30: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
aa40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
aa60: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
aa70: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
aa80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
aa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aaa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aab0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aac0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
aad0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
aae0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
aaf0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ab00: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ab10: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ab20: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ab30: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ab40: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
ab50: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
ab60: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
ab70: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
ab80: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
ab90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aba0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
abb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
abc0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
abd0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
abe0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
abf0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
ac10: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
ac20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac30: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
ac40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ac50: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ac60: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ac70: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ac80: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ac90: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aca0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
acb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
acc0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
acd0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ace0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
acf0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
ad00: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
ad10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ad30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ad50: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ad60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ad70: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ad80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ad90: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ada0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
adb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
adc0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
add0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
ae00: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
ae10: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
ae20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ae30: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
ae40: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ae50: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ae60: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ae70: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ae80: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ae90: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
aea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
aeb0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
aec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aed0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
aee0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
af00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
af20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
af30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
af40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
af50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
af60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
af70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
af80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
af90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
afa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
afc0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
afe0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aff0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b000: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b010: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b020: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b030: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b050: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b060: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b070: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b080: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b090: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b0a0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b0b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b0d0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b0e0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b0f0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b100: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b110: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b130: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b140: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b150: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b160: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b170: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b180: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b190: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b1a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b1b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b1c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b1d0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b1e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b200: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b210: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b220: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b230: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b240: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b250: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b260: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b270: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b280: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b290: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b2a0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b2b0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b2c0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b2d0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b2e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b2f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b300: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b360: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b370: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b380: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b390: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b3a0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b3b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b3c0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b3d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b3e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b3f0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b420: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b430: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b440: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b450: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b470: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b480: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b490: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b4a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b4c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b4d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b4e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b4f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b500: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b510: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b520: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b530: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b540: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b550: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b560: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b570: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b580: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b590: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b5a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b5b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b5c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b5d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b600: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b620: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b630: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b640: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b650: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b660: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b690: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b6a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b6b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b6d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b6e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b6f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b700: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b710: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b730: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b740: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b750: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b760: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b770: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b780: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b790: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b7a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b7b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b7c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b7d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b7e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b7f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b800: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b810: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b820: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b830: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b840: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b850: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b860: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b870: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b880: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b890: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b8a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b8b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b8c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b8e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b8f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b900: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b910: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b930: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b940: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b950: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b960: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b970: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b990: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b9a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b9b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b9c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b9e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b9f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
ba00: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ba10: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba30: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
ba40: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ba50: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ba60: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ba70: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
ba80: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ba90: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
baa0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
bab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
bac0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bad0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
bae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
baf0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
bb00: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
bb10: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
bb20: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
bb30: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
bb40: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bb50: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
bb60: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bb70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bb80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bb90: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bba0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bbb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bbc0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bbd0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bbe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bbf0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bc00: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bc10: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bc20: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bc50: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bc60: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bc70: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bc80: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bc90: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bca0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bcb0: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bcc0: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bcd0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bce0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bd00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bd10: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bd20: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bd30: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bd40: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bd50: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bd60: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bd80: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bd90: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bda0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bdb0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bdc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bdd0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bde0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bdf0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
be00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
be10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
be20: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
be30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
be40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
be50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
be60: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
be70: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
be80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
be90: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bea0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
beb0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bed0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bef0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bf00: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bf10: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bf20: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bf30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bf40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
bf50: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
bf60: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf70: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf80: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
bf90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bfa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
bfc0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
bfd0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
bfe0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bff0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c000: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c010: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c020: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c040: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c070: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c080: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c090: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c0a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c0b0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c0d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0e0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c0f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c100: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c110: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c120: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c130: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c140: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c150: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c170: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c180: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c190: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1b0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1c0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c1d0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c1e0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c210: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c220: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c230: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c250: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c260: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c270: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c280: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c290: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c2a0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c2c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c300: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c310: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c330: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c340: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c350: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c360: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c370: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c390: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c3a0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c3b0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c3c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c3d0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c3e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c3f0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c400: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c410: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c420: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c430: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c440: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c450: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c460: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c470: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c480: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c490: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c4a0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c4b0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c4c0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c4d0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c520: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c530: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c540: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c550: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c580: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c590: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c5a0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c5b0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c5c0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c5e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c5f0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c610: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c620: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c630: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c640: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c650: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c660: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c680: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c690: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c6d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c6e0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c710: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c720: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c760: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c770: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c790: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c7a0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c7b0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c7c0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c7d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7e0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c7f0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c800: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c810: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c820: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c830: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c840: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c850: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c860: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c870: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c880: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c890: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c8a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c8b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c8c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c8d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c8e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c8f0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c900: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c910: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c920: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c930: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c940: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c950: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c960: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c970: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c980: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c990: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c9b0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c9c0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c9d0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c9e0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c9f0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
ca00: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
ca10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
ca20: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
ca30: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
ca40: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
ca50: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
ca60: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ca70: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ca80: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ca90: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
caa0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
cab0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cad0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
cae0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
caf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cb00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
cb10: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb20: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
cb30: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
cb40: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
cb50: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
cb60: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
cb70: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
cb80: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
cb90: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
cba0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
cbc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cbd0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
cbe0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbf0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc00: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc10: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cc20: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cc30: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
cc40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cc50: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cc60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cc70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cc80: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cc90: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cca0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ccb0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ccc0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ccd0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cce0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ccf0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cd00: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cd10: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cd20: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cd30: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cd40: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cd50: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cd60: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cd70: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cd80: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cd90: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cda0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cdb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cdc0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cdd0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cde0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ce00: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ce10: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ce20: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ce30: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ce40: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ce50: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
ce60: 2c 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  ,       /* Do no
ce70: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
ce80: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ent if true */. 
ce90: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
cea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ceb0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
cec0: 61 70 29 20 70 61 67 65 20 69 73 20 6f 6b 20 2a  ap) page is ok *
ced0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
cee0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
cef0: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
cf00: 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f 20 50 41 47  (noContent ? PAG
cf10: 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f 4e  ER_ACQUIRE_NOCON
cf20: 54 45 4e 54 20 3a 20 30 29 20 0a 20 20 20 20 20  TENT : 0) .     
cf30: 20 20 20 20 20 20 20 7c 20 28 62 52 65 61 64 6f         | (bReado
cf40: 6e 6c 79 20 3f 20 50 41 47 45 52 5f 41 43 51 55  nly ? PAGER_ACQU
cf50: 49 52 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  IRE_READONLY : 0
cf60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 6f  );..  assert( no
cf70: 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 52  Content==0 || bR
cf80: 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadonly==0 );.  
cf90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cfa0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cfb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cfc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cfd0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cfe0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cff0: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
d000: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
d010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
d020: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
d030: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
d040: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
d050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d060: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
d070: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
d080: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d090: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
d0a0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
d0b0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
d0c0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
d0d0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
d0e0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
d0f0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
d100: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
d110: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
d120: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
d130: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
d140: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
d150: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
d160: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
d170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
d1a0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
d1b0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
d1c0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
d1d0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
d1e0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
d1f0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d200: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d210: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d220: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
d230: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
d240: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d250: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
d260: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
d270: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
d280: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
d290: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
d2a0: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
d2b0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
d2c0: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
d2d0: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
d2e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
d2f0: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
d300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d310: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
d320: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
d330: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
d340: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
d350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d360: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d370: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d380: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d390: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d3c0: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d3d0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d3e0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d3f0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d400: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d410: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d420: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d430: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d440: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d450: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d460: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d470: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d480: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d490: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d4a0: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d4b0: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d4c0: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d4d0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d4f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d500: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d530: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d540: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d550: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d560: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d570: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d580: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d590: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d5b0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
d5c0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
d5d0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
d5e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d600: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d610: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d620: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d640: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d660: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d670: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d680: 65 2c 20 30 2c 20 62 52 65 61 64 6f 6e 6c 79 29  e, 0, bReadonly)
d690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d6a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6b0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
d6c0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d6e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d6f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
d700: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
d710: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
d720: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
d730: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
d740: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
d750: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
d760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d770: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
d780: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
d790: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
d7a0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
d7b0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d7c0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
d7d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d7e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d7f0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d800: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d850: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
d860: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
d870: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
d880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d890: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d8a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
d8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d8d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d8e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d8f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
d900: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
d910: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
d920: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d930: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d940: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d950: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d960: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d970: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d980: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d990: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d9a0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d9b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d9c0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d9d0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d9e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d9f0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
da00: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
da10: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
da20: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
da30: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
da40: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
da50: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
da60: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
da80: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
da90: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
daa0: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
dab0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
dac0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
dad0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
dae0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
daf0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db00: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
db10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
db20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
db30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
db40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
db50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
db60: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
db70: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
db80: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db90: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
dba0: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
dbb0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
dbc0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
dbd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
dbe0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
dbf0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
dc00: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
dc10: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
dc20: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
dc30: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
dc40: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
dc50: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
dc70: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
dc80: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
dc90: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
dca0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
dcb0: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
dcc0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
dcd0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
dce0: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
dcf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
dd00: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
dd10: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
dd20: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
dd30: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
dd40: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
dd50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
dd60: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
dd70: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
dd80: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
dd90: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
dda0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ddb0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ddc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ddd0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
dde0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
ddf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
de20: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
de30: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
de40: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
de50: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
de60: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
de70: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
de80: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
de90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
dea0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
deb0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
dec0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
ded0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
dee0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
def0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
df00: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
df10: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
df20: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
df30: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
df40: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
df50: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
df60: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
df70: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
df80: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
df90: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
dfa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
dfb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dfc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dfd0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dfe0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
dff0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
e000: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
e010: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
e020: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
e030: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e040: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
e050: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
e060: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
e070: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
e080: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
e090: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
e0a0: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
e0b0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
e0c0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
e0d0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
e0e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e0f0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
e100: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
e110: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
e120: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
e130: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
e140: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
e150: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
e160: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
e170: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
e180: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
e190: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e1a0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
e1b0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
e1c0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
e1d0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
e1e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e1f0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
e200: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
e210: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
e220: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
e230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e240: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
e250: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
e260: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
e270: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
e280: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e2a0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
e2b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
e2c0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
e2d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2e0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
e2f0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
e300: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e320: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
e330: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
e340: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
e350: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
e360: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
e370: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e380: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e3a0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e3b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e3c0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e3f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e400: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e410: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e420: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e430: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e440: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e470: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e480: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e490: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4b0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e4c0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e4d0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e4e0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e4f0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e500: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e510: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e520: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e530: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e540: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e550: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e560: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e570: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e580: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e590: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e5a0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e5b0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e5c0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e5d0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e5e0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e5f0: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e610: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e620: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e630: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e640: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e650: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e660: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e670: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e6a0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e6b0: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
e6e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
e6f0: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
e700: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e720: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e730: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e740: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e760: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e770: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e780: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e790: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e7a0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e7b0: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e7c0: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e7d0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e7e0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e7f0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e800: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e810: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e820: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e830: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e840: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e850: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e860: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e870: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e880: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e890: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
e8a0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e8b0: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
e8c0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
e8d0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
e8e0: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
e8f0: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
e900: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
e910: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
e920: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
e930: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
e940: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
e950: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
e960: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
e970: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
e980: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e990: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e9a0: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
e9b0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
e9c0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
e9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
e9f0: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
ea00: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
ea10: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
ea20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ea30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ea40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ea50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ea60: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
ea70: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
ea80: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
ea90: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
eaa0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
eab0: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
eac0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
ead0: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
eae0: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
eaf0: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
eb00: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
eb10: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
eb20: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
eb30: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
eb40: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
eb50: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
eb60: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
eb70: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
eb80: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
eb90: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
eba0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
ebb0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ebc0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
ebd0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
ebe0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
ebf0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
ec00: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ec10: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
ec20: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ec30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ec50: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ec60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ec70: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
ec80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
eca0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
ecb0: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
ecc0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
ecd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ece0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ecf0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
ed00: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
ed30: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
ed40: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ed50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ed60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ed70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ed80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ed90: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
eda0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
edb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
edc0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
edd0: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
ede0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
edf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ee00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ee10: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
ee20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ee30: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
ee40: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
ee50: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ee60: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ee70: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ee80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ee90: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
eea0: 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
eeb0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
eec0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
eed0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
eee0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
eef0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
ef10: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
ef20: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
ef30: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
ef40: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
ef50: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
ef60: 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
ef70: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
ef80: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
ef90: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
efa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
efb0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
efc0: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
efd0: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
efe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
eff0: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
f000: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f010: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
f020: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
f030: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
f040: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f060: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
f070: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
f080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f090: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f0a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
f0b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f0c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f0e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f100: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
f110: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
f120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f130: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
f140: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f150: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
f160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f1a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f1b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f1c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f1d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f1e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
f1f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
f200: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
f210: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
f220: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
f230: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
f240: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
f250: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
f260: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
f270: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
f280: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
f290: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
f2a0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
f2b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
f2c0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f2d0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
f2e0: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
f2f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
f300: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f310: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
f320: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
f330: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
f340: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f350: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
f360: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
f370: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
f380: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
f390: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
f3a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
f3b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
f3c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
f3d0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
f3e0: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
f3f0: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
f400: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
f410: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f420: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
f430: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
f440: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f450: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
f460: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
f470: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f480: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
f490: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
f4a0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
f4b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
f4c0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
f4d0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
f4e0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
f4f0: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
f500: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
f510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f520: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
f530: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f540: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f550: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
f560: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
f570: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
f5a0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
f5b0: 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
f5c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f5d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f5e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f5f0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
f600: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
f610: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
f620: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
f630: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f640: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f650: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f660: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
f670: 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
f680: 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
f690: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
f6a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
f6b0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
f6c0: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
f6d0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
f6e0: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
f6f0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
f700: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
f710: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
f720: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
f730: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
f740: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
f750: 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
f760: 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
f770: 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
f780: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
f790: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
f7a0: 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
f7b0: 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
f7c0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f7d0: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
f7e0: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
f7f0: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
f800: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f810: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
f820: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
f830: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
f840: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
f850: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
f860: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
f870: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
f880: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
f890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f8a0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
f8b0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
f8c0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
f8d0: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
f8e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f8f0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
f900: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
f910: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
f920: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
f930: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
f940: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
f950: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
f960: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
f970: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
f980: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
f990: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
f9a0: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
f9b0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
f9c0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
f9d0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
f9e0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
f9f0: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
fa00: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
fa10: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
fa20: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
fa30: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
fa40: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
fa50: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fa60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fa70: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
fa80: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
fa90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
faa0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fab0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
fac0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
fad0: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
fae0: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
faf0: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
fb00: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
fb10: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
fb20: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
fb30: 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
fb40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fb60: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
fb70: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
fb80: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
fb90: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
fba0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
fbb0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fbc0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
fbd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
fbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fbf0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fc00: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
fc10: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
fc20: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
fc30: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
fc40: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fc50: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
fc60: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
fc70: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
fc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
fc90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
fca0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
fcb0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
fcc0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
fcd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fce0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fcf0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fd00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fd10: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
fd20: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
fd30: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
fd40: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
fd50: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
fd60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fd80: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
fd90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
fda0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
fdb0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
fdc0: 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
fdd0: 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
fde0: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
fdf0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
fe00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
fe10: 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
fe20: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
fe30: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
fe40: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
fe50: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
fe60: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
fe70: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
fe80: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
fe90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
fea0: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
feb0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
fec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fed0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
fee0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
fef0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
ff00: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
ff10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ff20: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ff30: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
ff40: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
ff50: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
ff60: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ff70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ff80: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
ff90: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ffa0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ffb0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
ffc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ffd0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
ffe0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fff0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10000 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10010 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10020 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10030 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10040 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10050 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10060 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10070 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10080 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10090 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
100a0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
100b0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
100c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
100d0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
100e0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
100f0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10100 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10110 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10120 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10130 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10140 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10150 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
10160 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
10170 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
10180 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
10190 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
101a0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
101b0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
101c0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
101d0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
101e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
101f0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
10200 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
10210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
10220 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
10230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10240 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
10250 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
10260 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
10270 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10280 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
10290 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
102a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
102b0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
102c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
102d0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
102e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
102f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
10300 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
10310 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10330 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
10340 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
10350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
10370 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
10380 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
10390 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
103a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103b0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
103c0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
103d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
103e0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
103f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10400 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
10410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10420 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
10430 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10440 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
10450 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
10460 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
10470 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10480 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
10490 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
104a0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
104b0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
104c0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
104d0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
104e0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
104f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10500 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10510 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10520 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
10530 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10540 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
10550 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
10560 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
10570 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
10580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10590 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
105a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
105c0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
105d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
105e0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
105f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10600 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
10610 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
10620 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
10630 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
10640 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
10650 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
10660 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
10670 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
10680 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
10690 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
106a0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
106b0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
106c0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
106d0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
106e0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
106f0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
10700 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
10710 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
10720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10730 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
10740 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
10750 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
10760 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
10770 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
10780 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
10790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107a0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
107b0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
107c0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
107d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
107e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
107f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
10800 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
10810 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
10820 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
10830 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
10840 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
10850 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10860 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10870 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
10880 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
10890 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
108b0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
108c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
108d0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
108e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10900 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
10910 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
10920 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
10930 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10940 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
10950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10960 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
10970 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
10980 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
10990 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
109a0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
109b0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
109d0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
109e0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
109f0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
10a00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10a10 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
10a20 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
10a30 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
10a40 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
10a50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
10a60 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
10a70 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
10a80 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
10a90 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
10aa0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
10ab0 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
10ac0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
10ad0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
10ae0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
10af0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
10b00 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10b10 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
10b20 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
10b30 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
10b40 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
10b50 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
10b60 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
10b70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
10b80 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
10b90 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
10ba0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
10bb0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
10bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bd0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
10be0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
10bf0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
10c00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
10c10 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
10c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10c30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
10c40 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
10c50 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
10c60 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
10c70 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
10c80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10c90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
10ca0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
10cb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10cc0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
10cd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
10ce0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
10cf0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
10d00 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
10d10 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
10d20 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
10d30 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
10d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10d50 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
10d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10d70 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
10d80 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
10d90 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
10da0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
10db0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
10dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
10dd0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
10de0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
10df0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
10e00 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
10e10 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10e20 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
10e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10e40 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
10e50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
10e60 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
10e70 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
10e80 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
10e90 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
10ea0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
10eb0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
10ec0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
10ed0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
10ee0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10ef0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
10f00 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10f10 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
10f20 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
10f30 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
10f40 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
10f50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
10f60 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
10f70 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
10f80 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
10f90 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
10fa0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
10fb0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
10fc0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
10fd0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
10fe0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
10ff0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11000 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11010 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11020 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11030 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11040 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11050 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11060 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
11070 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
11080 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
11090 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
110a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
110b0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
110c0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
110d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
110e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
110f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11110 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11120 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11130 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11140 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11150 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
11160 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
11170 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
11180 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
11190 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
111a0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
111b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
111c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
111d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
111e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
111f0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11200 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11210 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11220 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11230 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11240 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11250 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11260 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11270 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11280 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
11290 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
112a0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
112b0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
112c0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
112d0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
112e0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
112f0 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11300 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11310 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11320 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11330 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11340 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11350 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11360 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11370 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11380 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11390 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
113a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
113b0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
113c0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
113d0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
113e0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
113f0 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11400 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11410 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11420 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11430 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11440 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11450 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11460 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11470 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11480 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11490 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
114a0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
114b0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
114c0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
114d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
114e0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
114f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11500 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11510 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11530 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11540 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11550 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11590 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
115a0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
115b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
115c0 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
115d0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
115e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
115f0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
11600 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
11610 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
11620 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
11630 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11650 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11670 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11680 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11690 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
116a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 4d 6d  Bt->pPager, mxMm
116b0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
116c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
116d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
116f0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
11700 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11710 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11720 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11730 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11740 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11750 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11760 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11770 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11780 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11790 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
117a0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
117b0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
117c0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
117d0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
117e0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
117f0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
11800 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11810 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11820 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11830 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11840 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11850 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11860 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11870 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11880 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11890 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
118a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
118b0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
118c0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
118d0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
118e0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11900 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11910 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11920 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11930 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11940 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11950 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11960 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11970 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11980 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11990 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
119a0 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
119b0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
119c0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
119d0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
119e0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
119f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11a00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11a10 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11a20 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11a30 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11a40 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11a50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11a60 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11a70 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11a80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11a90 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11aa0 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
11ab0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ac0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11ae0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
11af0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11b00 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11b10 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11b20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11b30 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11b40 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11b50 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11b60 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11b80 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11b90 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11ba0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11bb0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11bc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11bd0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11be0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
11bf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11c00 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11c10 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11c20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11c30 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11c40 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11c50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11c70 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11c80 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11c90 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11ca0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
11cb0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
11cc0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
11cd0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
11ce0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
11cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11d00 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
11d10 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
11d20 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11d30 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11d40 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11d50 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11d60 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11d70 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11d80 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11d90 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11da0 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
11db0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
11dc0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
11dd0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
11de0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
11df0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
11e00 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11e10 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11e20 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11e30 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11e40 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11e50 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11e60 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11e70 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11e80 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11e90 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11ea0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11eb0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
11ec0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
11ed0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
11ee0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
11ef0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
11f00 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11f10 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11f20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11f30 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11f40 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
11f50 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
11f60 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
11f70 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
11f80 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
11f90 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
11fa0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
11fb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11fc0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
11fd0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
11fe0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
11ff0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
12000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12010 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
12020 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
12030 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
12040 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
12050 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
12060 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12070 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
12080 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12090 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
120a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
120b0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
120c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
120d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
120e0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
120f0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
12100 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12110 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
12120 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
12130 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
12140 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
12150 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
12160 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
12170 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
12180 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
12190 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
121a0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
121b0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
121c0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
121d0 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
121e0 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
121f0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
12200 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
12210 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
12220 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
12230 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12240 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12250 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12260 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12270 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
12280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
12290 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
122a0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
122b0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
122c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
122d0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
122e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
122f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12300 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12310 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
12320 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
12330 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
12340 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
12350 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
12360 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
12370 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
12380 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12390 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
123a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
123b0 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
123c0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
123d0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
123e0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
123f0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
12400 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
12410 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
12420 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
12430 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
12440 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
12450 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
12460 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
12470 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
12480 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
12490 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
124a0 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
124b0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
124c0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
124d0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
124e0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
124f0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
12500 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
12510 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
12520 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
12530 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
12540 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
12550 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
12560 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
12570 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
12580 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12590 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
125a0 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
125b0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
125c0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
125d0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
125e0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
125f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12600 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
12610 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
12620 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
12630 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
12640 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
12650 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
12660 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
12670 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12680 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
12690 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
126a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
126b0 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
126c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
126d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
126e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
126f0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12700 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
12710 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
12720 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
12730 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
12740 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
12750 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
12760 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
12770 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12780 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
12790 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
127a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
127b0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
127c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
127d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
127e0 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
127f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12800 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12810 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
12820 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
12830 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
12840 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12850 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
12860 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
12870 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
12880 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
12890 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
128a0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
128b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
128c0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
128d0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
128e0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
128f0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
12900 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
12910 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12920 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
12930 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
12940 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
12950 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
12960 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12970 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12980 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
12990 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
129a0 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
129b0 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
129c0 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
129d0 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
129e0 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
129f0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12a00 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
12a10 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
12a20 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
12a30 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
12a40 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
12a50 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
12a60 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
12a70 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
12a80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12a90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12aa0 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
12ab0 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
12ac0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
12ad0 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
12ae0 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
12af0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
12b00 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
12b10 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
12b20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
12b30 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12b40 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
12b50 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
12b60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12b70 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
12b80 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12b90 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
12ba0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
12bb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12bc0 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
12bd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
12be0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
12bf0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
12c00 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
12c10 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
12c20 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
12c30 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
12c40 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
12c50 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
12c60 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
12c70 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
12c80 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
12c90 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
12ca0 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
12cb0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
12cc0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
12cd0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
12ce0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12cf0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
12d00 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
12d10 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
12d20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12d30 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
12d40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
12d50 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
12d60 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12d70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12d80 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
12d90 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
12da0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12db0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
12dc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12dd0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
12de0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
12df0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
12e00 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
12e10 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
12e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
12e30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
12e40 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
12e50 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
12e60 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
12e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12e80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12e90 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
12ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
12eb0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
12ec0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12ed0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
12ee0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
12ef0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
12f00 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
12f10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12f20 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
12f30 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
12f40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12f50 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
12f60 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
12f70 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
12f80 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12f90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12fa0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
12fb0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
12fc0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12fd0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
12fe0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
12ff0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
13000 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
13010 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
13020 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
13030 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13040 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
13050 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
13060 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
13070 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
13080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13090 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
130a0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
130b0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
130c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
130d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
130e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
130f0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
13100 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
13110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13120 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
13130 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
13140 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
13150 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
13160 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
13170 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
13180 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
13190 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
131a0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
131b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
131c0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
131d0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131f0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
13200 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
13210 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
13220 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
13230 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
13240 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
13250 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
13260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
13270 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
13280 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
13290 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
132a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
132b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
132c0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
132d0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
132e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
132f0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
13300 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
13310 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
13320 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13330 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
13350 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
13360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13370 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
13380 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
13390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
133a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
133b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
133c0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
133d0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
133e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
133f0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
13400 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
13410 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
13420 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
13430 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
13440 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
13450 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
13460 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
13470 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
13480 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
13490 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
134a0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
134b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
134c0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
134d0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
134e0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
134f0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
13500 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
13510 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
13520 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
13530 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
13540 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
13550 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
13560 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
13570 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
13580 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
13590 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
135a0 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
135b0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
135c0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
135d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
135e0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
135f0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
13600 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
13610 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
13620 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
13630 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
13640 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13650 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13660 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
13670 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13680 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
13690 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
136a0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
136b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136c0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
136d0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
136e0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
136f0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13700 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
13710 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
13720 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
13730 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
13740 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
13750 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
13760 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
13770 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
13780 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
13790 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
137a0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
137b0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
137c0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
137d0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
137e0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
137f0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
13800 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
13810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
13820 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
13830 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
13840 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
13850 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
13860 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
13870 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
13880 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
13890 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
138a0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
138b0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
138c0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
138d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
138e0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
138f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13900 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
13910 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
13920 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
13930 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
13940 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
13950 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
13960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
13980 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13990 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
139a0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
139b0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
139c0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
139d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
139e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
139f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13a00 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
13a10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
13a20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
13a30 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13a40 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
13a50 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
13a60 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
13a70 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
13a80 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
13a90 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
13aa0 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
13ab0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
13ac0 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
13ad0 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
13ae0 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
13af0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
13b00 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
13b10 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
13b20 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
13b30 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
13b40 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
13b50 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
13b60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13b70 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13b80 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
13b90 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
13ba0 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
13bb0 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28  <<16);.    if( (
13bc0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
13bd0 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c  eSize)!=0.     |
13be0 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  | pageSize>SQLIT
13bf0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
13c00 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
13c10 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20  e<=256 .    ){. 
13c20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13c30 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13c40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
13c50 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13c60 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   );.    usableSi
13c70 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
13c80 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
13c90 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
13ca0 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
13cb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
13cc0 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
13cd0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
13ce0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
13cf0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
13d00 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
13d10 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
13d20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
13d30 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
13d40 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
13d50 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
13d60 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
13d70 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
13d80 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
13d90 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
13da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
13db0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
13dc0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
13dd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
13de0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
13df0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
13e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
13e10 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13e20 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
13e30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
13e40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
13e50 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
13e60 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
13e70 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
13e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e90 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
13ea0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
13eb0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
13ef0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
13f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13f10 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
13f20 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
13f30 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
13f40 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
13f50 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
13f60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
13f70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
13f80 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13f90 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
13fa0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
13fb0 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
13fc0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13fd0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
13fe0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
13ff0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
14000 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
14010 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
14020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14030 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
14040 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14050 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
14060 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
14070 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
14080 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14090 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
140a0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
140b0 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
140c0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
140d0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
140e0 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
140f0 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
14100 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
14110 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
14120 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
14130 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
14140 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
14150 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
14160 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
14170 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
14180 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
14190 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
141a0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
141b0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
141c0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
141d0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
141e0 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
141f0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
14200 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
14210 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
14220 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
14230 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
14240 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
14250 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
14260 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
14270 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
14280 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
14290 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
142a0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
142b0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
142c0 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
142d0 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
142e0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
142f0 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
14300 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
14310 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
14320 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14330 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
14340 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
14350 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
14360 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
14370 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
14380 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
14390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
143a0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
143b0 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
143c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
143d0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
143e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
143f0 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
14400 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
14410 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
14420 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
14430 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
14440 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
14450 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
14460 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
14470 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
14480 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
14490 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
144a0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
144b0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
144c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
144d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
144e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
144f0 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
14500 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
14510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14520 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
14530 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
14540 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
14550 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
14560 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
14570 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
14580 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
14590 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
145a0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
145b0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
145c0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
145d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
145e0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
145f0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
14600 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
14610 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
14620 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
14630 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
14640 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
14650 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
14660 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
14670 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
14680 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14690 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
146a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
146b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
146c0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
146d0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
146e0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
146f0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
14700 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14710 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
14720 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
14730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14740 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14760 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14770 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
14780 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
14790 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
147a0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65  >aData );.    re
147b0 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
147c0 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d  Page1);.    pBt-
147d0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
147e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
147f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
14800 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
14810 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
14820 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
14830 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
14840 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
14850 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
14860 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
14870 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
14880 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
14890 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
148a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
148b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
148c0 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
148d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
148e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
148f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14900 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
14910 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14930 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
14940 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
14950 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
14960 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
14970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14980 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
14990 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
149a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
149b0 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
149c0 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
149d0 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
149e0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
149f0 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
14a00 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
14a10 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
14a20 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
14a30 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
14a40 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
14a50 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
14a60 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
14a70 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
14a80 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
14a90 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
14aa0 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
14ab0 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
14ac0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
14ad0 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
14ae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14af0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
14b00 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
14b10 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
14b20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
14b30 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
14b40 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
14b50 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
14b60 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
14b70 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
14b80 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
14b90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
14ba0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
14bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14bc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
14bd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
14be0 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
14bf0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
14c00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14c10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
14c20 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
14c30 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
14c40 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
14c50 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
14c60 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
14c70 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
14c80 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
14c90 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
14ca0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a  pBt->nPage = 1;.
14cb0 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a    data[31] = 1;.
14cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14cd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
14ce0 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73  tialize the firs
14cf0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14d00 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65  tabase file (cre
14d10 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ating a database
14d20 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  .** consisting o
14d30 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
14d40 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62  and no schema ob
14d50 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53  jects). Return S
14d60 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73  QLITE_OK.** if s
14d70 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
14d80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
14d90 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
14da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14db0 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29  eNewDb(Btree *p)
14dc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
14dd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14de0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50  p);.  p->pBt->nP
14df0 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
14e00 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70  newDatabase(p->p
14e10 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
14e20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14e30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14e40 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 61  ** Ensure that a
14e50 6e 79 20 72 6f 6f 74 20 70 61 67 65 20 72 65 66  ny root page ref
14e60 65 72 65 6e 63 65 73 20 68 65 6c 64 20 62 79 20  erences held by 
14e70 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65  open cursors are
14e80 20 6e 6f 74 0a 2a 2a 20 6d 6d 61 70 20 70 61 67   not.** mmap pag
14e90 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
14ea0 74 20 62 74 72 65 65 53 77 61 70 4f 75 74 4d 6d  t btreeSwapOutMm
14eb0 61 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ap(BtShared *pBt
14ec0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14ed0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
14ee0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
14ef0 6f 64 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ode */.  BtCurso
14f00 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
14f10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
14f20 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
14f30 75 67 68 20 61 6c 6c 20 6f 70 65 6e 20 63 75 72  ugh all open cur
14f40 73 6f 72 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 70  sors */..  for(p
14f50 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Csr=pBt->pCursor
14f60 3b 20 70 43 73 72 20 26 26 20 72 63 3d 3d 53 51  ; pCsr && rc==SQ
14f70 4c 49 54 45 5f 4f 4b 3b 20 70 43 73 72 3d 70 43  LITE_OK; pCsr=pC
14f80 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  sr->pNext){.    
14f90 69 66 28 20 70 43 73 72 2d 3e 69 50 61 67 65 3e  if( pCsr->iPage>
14fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  =0 ){.      MemP
14fb0 61 67 65 20 2a 70 50 67 20 3d 20 70 43 73 72 2d  age *pPg = pCsr-
14fc0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20  >apPage[0];.    
14fd0 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67    if( pPg && pPg
14fe0 2d 3e 70 44 62 50 61 67 65 2d 3e 66 6c 61 67 73  ->pDbPage->flags
14ff0 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
15000 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
15010 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
15020 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
15030 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 50 67  nitPage(pBt, pPg
15040 2d 3e 70 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 30  ->pgno, &pNew, 0
15050 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15070 70 43 73 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCsr->iPage==0 )
15080 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72  {.          pCsr
15090 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 3d 20 70  ->info.pCell = p
150a0 4e 65 77 2d 3e 61 44 61 74 61 20 2b 20 28 70 43  New->aData + (pC
150b0 73 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2d  sr->info.pCell -
150c0 20 70 50 67 2d 3e 61 44 61 74 61 29 3b 0a 20 20   pPg->aData);.  
150d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
150e0 70 43 73 72 2d 3e 61 70 50 61 67 65 5b 30 5d 20  pCsr->apPage[0] 
150f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
15100 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
15110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
15130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
15150 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15160 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
15170 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
15180 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
15190 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
151a0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
151b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
151c0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
151d0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
151e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
151f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
15200 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
15210 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
15220 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
15230 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
15240 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
15250 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
15260 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
15270 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
15280 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
15290 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
152a0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
152b0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
152c0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
152d0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
152e0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
152f0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
15300 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
15310 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
15320 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
15330 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15340 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
15350 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
15360 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
15370 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
15380 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
15390 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
153a0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
153b0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
153c0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
153d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
153e0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
153f0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15400 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
15410 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
15420 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
15430 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
15440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
15450 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
15460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
15470 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
15480 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
15490 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
154a0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
154b0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
154c0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
154d0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
154e0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
154f0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
15500 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
15510 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
15520 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
15530 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
15540 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
15550 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
15560 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
15570 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
15580 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
15590 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
155a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
155b0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
155c0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
155d0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
155e0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
155f0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
15600 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
15610 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
15620 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
15630 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
15640 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
15650 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
15660 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
15670 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
15680 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
15690 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
156a0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
156b0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
156c0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
156d0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
156e0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
156f0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
15700 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
15710 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
15720 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
15730 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
15740 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
15750 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
15760 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
15770 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
15780 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
15790 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
157a0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
157b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
157c0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
157d0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
157e0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
157f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15800 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
15810 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
15820 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
15830 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
15840 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15850 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15870 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15880 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
15890 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
158a0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
158b0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
158c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
158d0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
158e0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
158f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
15900 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
15910 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
15920 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
15930 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
15940 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15950 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
15960 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15970 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
15980 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
15990 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
159a0 20 61 73 73 65 72 74 28 20 49 66 4e 6f 74 4f 6d   assert( IfNotOm
159b0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
159c0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
159d0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
159e0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
159f0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
15a00 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
15a10 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15a20 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15a30 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15a40 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15a50 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15a60 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15a70 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15a80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15a90 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15aa0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
15ab0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
15ac0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
15ad0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
15ae0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
15af0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
15b00 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
15b10 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15b20 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15b30 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15b40 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15b60 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15b70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15b80 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15b90 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15ba0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
15bb0 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
15bc0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
15bd0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
15be0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
15bf0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
15c00 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
15c10 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15c20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15c30 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15c40 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15c50 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15c60 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15c70 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15c80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15c90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
15ca0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
15cb0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
15cc0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
15cd0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
15ce0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
15cf0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
15d00 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
15d10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15d20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
15d30 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
15d40 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
15d50 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
15d60 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
15d70 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
15d80 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
15d90 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
15da0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
15db0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
15dc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
15dd0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
15de0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
15df0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
15e00 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
15e10 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
15e20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
15e30 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
15e40 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
15e50 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
15e60 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
15e70 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15e80 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
15e90 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
15ea0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
15eb0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
15ec0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
15ed0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
15ee0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
15ef0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
15f00 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
15f10 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
15f20 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
15f30 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
15f40 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
15f50 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
15f60 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
15f70 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
15f80 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
15f90 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
15fa0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
15fb0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
15fc0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
15fd0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
15fe0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
15ff0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
16000 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
16010 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
16020 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
16030 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
16040 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
16050 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
16060 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
16070 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
16080 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
16090 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
160a0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
160b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
160c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
160d0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
160e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
160f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16120 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
16130 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
16140 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
16150 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
16160 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16180 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
16190 65 53 77 61 70 4f 75 74 4d 6d 61 70 28 70 42 74  eSwapOutMmap(pBt
161a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
161b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
161c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
161d0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
161e0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
161f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16200 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
16210 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16220 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
16230 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
16240 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
16250 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
16260 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
16270 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
16280 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
16290 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
162a0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
162b0 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
162c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
162d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
162e0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
162f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
16300 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
16310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16320 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16330 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
16340 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16350 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
16360 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
16370 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
16380 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
16390 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
163a0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
163b0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
163c0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
163d0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
163e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
163f0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
16400 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
16410 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
16420 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
16430 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
16440 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
16450 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
16460 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
16470 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
16480 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
16490 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
164a0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
164b0 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
164c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
164d0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
164e0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
164f0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
16500 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
16510 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
16520 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
16530 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
16540 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
16550 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16560 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
16570 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
16580 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
16590 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
165a0 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
165b0 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
165c0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
165d0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
165e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
165f0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
16600 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
16610 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
16620 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
16630 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
16640 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
16650 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
16660 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
16670 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
16680 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
16690 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
166a0 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
166b0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
166c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
166d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
166e0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
166f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
16700 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
16710 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16720 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
16730 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
16740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16760 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16770 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
16780 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
16790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
167a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
167b0 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
167c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
167d0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
167e0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
167f0 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
16800 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
16810 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
16820 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
16830 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
16840 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
16850 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
16860 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
16870 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
16880 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
16890 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
168a0 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
168b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
168c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
168d0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
168e0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
168f0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
16900 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
16910 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
16920 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16930 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
16940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16950 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
16960 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
16970 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
16980 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
16990 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
169a0 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
169b0 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
169c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
169d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
169e0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
169f0 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
16a00 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
16a10 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
16a20 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
16a30 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
16a40 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
16a50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a70 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
16a80 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
16a90 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ab0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
16ac0 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
16ad0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16b00 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
16b10 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
16b20 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
16b30 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
16b40 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
16b50 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
16b60 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
16b70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16b80 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
16b90 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ex) );.  rc = bt
16ba0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
16bb0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
16bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
16bd0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
16be0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
16bf0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
16c00 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
16c10 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
16c20 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
16c30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
16c40 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
16c50 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
16c60 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
16c70 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
16c80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
16c90 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
16ca0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
16cb0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
16cc0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
16cd0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
16ce0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
16cf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
16d00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16d10 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
16d20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
16d30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
16d40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
16d50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16d60 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
16d70 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
16d80 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  &rc);.  }..set_c
16d90 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
16da0 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
16db0 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
16dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16dd0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
16de0 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
16df0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
16e00 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
16e10 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
16e20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
16e30 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
16e40 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
16e50 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
16e60 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
16e70 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
16e80 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
16e90 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
16ea0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
16eb0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
16ec0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
16ed0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
16ee0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
16ef0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
16f00 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
16f10 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16f20 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16f30 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
16f40 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
16f60 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
16f70 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
16f80 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
16f90 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
16fa0 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
16fb0 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
16fc0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
16fd0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
17000 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
17010 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
17020 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
17030 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
17040 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
17050 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
17060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17070 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
17080 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
17090 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
170a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
170b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
170c0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
170d0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
170e0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
170f0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
17100 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
17110 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
17120 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
17130 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
17140 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17150 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
17160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17170 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
17180 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
17190 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
171a0 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
171b0 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
171c0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
171d0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
171e0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
171f0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
17200 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  Page);.    nCell
17210 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
17220 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
17230 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
17240 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
17250 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
17260 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
17270 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17280 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
17290 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
172a0 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
172b0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
172c0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
172d0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
172e0 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  .iOverflow.     
172f0 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
17300 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70  o.iOverflow+3<=p
17310 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
17320 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20  e->maskPage.    
17330 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67       && iFrom==g
17340 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
17350 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a  nfo.iOverflow]).
17360 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
17370 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
17380 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
17390 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
173a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
173b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
173c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
173d0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
173e0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
173f0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
17400 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
17410 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17430 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
17440 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
17450 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
17460 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
17470 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
17480 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
17490 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
174a0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
174b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
174c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
174d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
174e0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
174f0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
17500 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
17510 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
17520 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
17530 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
17540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17550 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
17560 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
17570 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
17580 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
17590 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
175a0 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
175b0 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
175c0 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
175d0 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
175e0 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
175f0 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
17600 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
17610 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
17620 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
17630 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
17640 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
17650 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
17660 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
17670 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
17680 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
17690 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
176a0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
176b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
176c0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
176d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
176e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
176f0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
17700 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
17710 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
17720 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
17730 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
17740 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
17750 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
17760 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
17770 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
17780 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17790 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
177a0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
177b0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
177c0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
177d0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
177e0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
177f0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
17800 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
17810 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
17820 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
17830 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17840 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
17850 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
17860 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
17870 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
17880 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
17890 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
178a0 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
178b0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
178c0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
178d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
178e0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
178f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
17900 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17910 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
17920 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
17930 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
17940 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17960 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17970 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17980 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
17990 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
179a0 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
179b0 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
179c0 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
179d0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
179e0 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
179f0 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
17a00 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
17a10 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
17a20 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
17a30 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
17a40 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
17a50 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
17a60 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
17a70 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
17a80 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
17a90 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
17aa0 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
17ab0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17ad0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
17ae0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
17af0 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
17b00 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
17b10 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
17b20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
17b30 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
17b40 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
17b50 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
17b60 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
17b70 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
17b80 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
17b90 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
17ba0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
17bb0 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
17bc0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
17bd0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
17be0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
17bf0 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
17c00 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
17c10 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
17c20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
17c30 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
17c40 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
17c50 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
17c60 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
17c70 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
17c80 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
17c90 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17ca0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
17cb0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
17cc0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
17cd0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
17ce0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
17cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17d00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17d10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
17d20 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
17d30 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
17d40 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
17d50 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
17d60 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
17d70 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
17d80 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
17d90 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
17da0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
17db0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17dc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
17dd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17de0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
17df0 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
17e00 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
17e10 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
17e20 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
17e30 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
17e40 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
17e50 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
17e60 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
17e70 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
17e80 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
17e90 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
17ea0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
17eb0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17ec0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
17ed0 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 2c  e, &pPtrPage, 0,
17ee0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
17ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17f10 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
17f20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17f30 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
17f40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
17f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17f60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17f70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
17f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17f90 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
17fa0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
17fb0 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
17fc0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
17fd0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
17fe0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
17ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
18010 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
18020 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
18030 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
18040 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18050 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
18060 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
18070 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
18080 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
18090 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
180a0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
180b0 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
180c0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
180d0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
180e0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
180f0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
18100 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
18110 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
18120 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
18130 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
18140 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
18150 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
18160 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
18170 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
18180 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
18190 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
181a0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
181b0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
181c0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
181d0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
181e0 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
181f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
18200 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
18210 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
18220 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
18230 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
18240 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
18250 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
18260 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
18270 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
18280 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
18290 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
182a0 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
182b0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
182c0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
182d0 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
182e0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
182f0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
18300 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
18310 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
18320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18330 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
18340 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
18350 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
18360 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
18370 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
18380 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
18390 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
183a0 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
183b0 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
183c0 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74  acuum-on-commmit
183d0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
183e0 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
183f0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
18400 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
18410 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
18420 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18430 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
18440 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
18450 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
18460 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
18470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18480 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
18490 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
184a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
184b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
184c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
184d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
184e0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
184f0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
18500 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
18510 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
18520 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18530 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
18540 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
18550 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
18560 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
18570 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18580 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
18590 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
185a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
185b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
185c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
185d0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
185e0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
185f0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
18600 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18620 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18630 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18640 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18650 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18660 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18670 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
18680 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
18690 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
186a0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
186b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
186c0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
186d0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
186e0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
186f0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
18700 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
18710 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
18720 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
18730 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
18740 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
18750 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
18760 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
18770 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
18780 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
18790 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
187a0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
187b0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
187c0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
187d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
187e0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
187f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
18800 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
18810 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
18820 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
18830 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
18840 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
18850 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
18860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
18880 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
18890 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
188a0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
188b0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
188c0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
188d0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
188e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
188f0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
18900 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18910 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
18920 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
18930 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
18940 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
18950 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
18960 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
18970 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
18980 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
18990 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
189a0 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
189b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
189c0 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
189d0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
189e0 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
189f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
18a00 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
18a10 26 70 4c 61 73 74 50 67 2c 20 30 2c 20 30 29 3b  &pLastPg, 0, 0);
18a20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18a50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18a60 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
18a70 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
18a80 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
18a90 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
18aa0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
18ab0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
18ac0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
18ad0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
18ae0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
18af0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
18b00 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
18b10 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
18b20 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
18b30 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
18b40 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
18b50 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
18b60 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
18b70 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
18b80 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
18b90 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
18ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18bb0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
18bc0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
18bd0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
18be0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
18bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c00 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
18c10 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
18c20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
18c30 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
18c40 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
18c50 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
18c60 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
18c70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
18c90 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
18ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
18cb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
18cc0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
18cd0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
18ce0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
18cf0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
18d00 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
18d10 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
18d20 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
18d30 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
18d40 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
18d50 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
18d60 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
18d70 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
18d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
18d90 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
18da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18db0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18dc0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
18dd0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
18de0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
18df0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
18e00 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
18e10 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
18e20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18e30 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
18e40 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
18e50 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
18e60 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
18e70 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
18e80 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
18e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
18eb0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
18ec0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
18ed0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
18ee0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
18ef0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
18f00 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
18f10 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
18f20 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
18f30 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
18f40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18f50 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
18f60 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
18f70 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
18f80 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
18f90 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
18fa0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
18fb0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
18fc0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
18ff0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
19000 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
19010 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
19020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19030 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
19040 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
19050 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
19060 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
19070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19080 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
19090 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
190a0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
190b0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
190c0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
190d0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
190e0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
190f0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
19100 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
19110 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
19120 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19130 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
19140 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19150 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
19160 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
19170 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19180 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
19190 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
191a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
191b0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
191c0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
191d0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
191e0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
191f0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
19200 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
19210 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
19220 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
19230 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
19240 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
19250 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
19260 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
19270 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
19280 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
19290 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
192a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
192b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
192c0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
192d0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
192e0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
192f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19300 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
19310 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19320 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
19330 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
19340 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
19350 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
19360 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19370 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
19380 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
19390 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
193a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
193b0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
193c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
193d0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
193e0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
193f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
19400 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
19410 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
19420 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
19430 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
19440 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
19450 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19460 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
19470 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
19480 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
19490 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
194a0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
194b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
194c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
194d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
194e0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
194f0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
19500 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
19510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19530 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
19540 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
19550 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
19560 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
19570 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
19580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
195a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
195b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
195c0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
195d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
195e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
195f0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19600 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
19610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19620 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
19630 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
19640 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
19650 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19670 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19680 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
19690 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
196a0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
196b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
196c0 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
196d0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
196e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
196f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19700 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
19710 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
19720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
19730 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
19740 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
19750 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
19760 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
19770 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
19780 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
19790 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
197a0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
197b0 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
197c0 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
197d0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
197e0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
197f0 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
19800 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
19810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19820 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
19830 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
19840 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
19850 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
19860 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
19870 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
19880 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19890 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
198a0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
198b0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
198c0 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
198d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
198e0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
198f0 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
19900 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
19910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19920 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
19930 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
19940 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
19950 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
19960 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19970 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
19980 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
19990 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
199a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
199b0 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
199c0 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
199d0 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
199e0 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
199f0 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
19a00 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
19a10 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
19a20 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
19a30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
19a40 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
19a50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19a60 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
19a70 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
19a80 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
19a90 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
19aa0 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
19ab0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
19ac0 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
19ad0 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
19ae0 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
19af0 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
19b00 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
19b10 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
19b20 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
19b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
19b40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19b50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
19b60 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
19b70 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
19b80 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
19b90 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
19ba0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
19bb0 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
19bc0 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
19bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19be0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66  UPT_BKPT;..    f
19bf0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
19c00 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
19c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
19c20 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
19c30 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
19c40 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
19c50 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
19c60 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
19c70 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
19c80 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
19c90 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
19ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19cb0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
19cc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
19cd0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
19ce0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
19cf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
19d00 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
19d10 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
19d20 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
19d30 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
19d40 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
19d50 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
19d60 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
19d70 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
19d80 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
19d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19da0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
19db0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19dc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
19dd0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
19de0 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
19df0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
19e00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
19e10 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
19e20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19e30 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
19e40 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
19e50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
19e60 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
19e70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
19e80 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
19e90 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
19ea0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
19eb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
19ec0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
19ed0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
19ee0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
19ef0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
19f00 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
19f10 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
19f20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
19f30 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
19f40 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
19f50 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
19f60 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
19f70 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
19f80 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
19f90 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
19fa0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
19fb0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
19fc0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
19fd0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
19fe0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
19ff0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1a000 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1a010 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1a020 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1a030 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1a040 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1a050 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1a060 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1a070 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1a080 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1a090 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1a0a0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1a0b0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1a0c0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1a0d0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1a0e0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1a0f0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1a100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a110 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1a120 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1a130 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1a140 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1a150 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1a160 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1a170 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1a180 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1a190 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1a1a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1a1b0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1a1c0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1a1d0 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1a1e0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1a1f0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1a200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1a210 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1a220 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1a230 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1a240 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1a250 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1a260 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1a270 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1a280 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1a290 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1a2a0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1a2b0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1a2c0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1a2d0 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1a2e0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1a2f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1a300 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1a310 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1a320 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1a330 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1a340 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1a350 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1a360 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1a370 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1a380 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1a390 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1a3a0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1a3b0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1a3c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1a3d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1a3e0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1a3f0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1a400 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a410 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1a420 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a430 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1a440 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a450 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a460 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1a470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a480 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1a490 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a4a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1a4b0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1a4c0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1a4d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a4e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a4f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1a510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a520 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1a530 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1a540 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1a550 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1a560 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1a570 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1a580 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1a590 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1a5a0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1a5b0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1a5c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a5d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1a5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a5f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a600 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1a610 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1a620 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1a630 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1a640 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1a650 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1a660 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1a670 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1a680 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1a690 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1a6a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a6b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a6c0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1a6d0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1a6e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1a6f0 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1a700 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1a710 65 6e 64 69 66 0a 20 20 62 74 72 65 65 43 6c 65  endif.  btreeCle
1a720 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1a730 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
1a740 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1a750 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56  & p->db->activeV
1a760 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20  dbeCnt>1 ){.    
1a770 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1a780 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
1a790 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
1a7a0 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
1a7b0 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
1a7c0 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
1a7d0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1a7e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
1a7f0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
1a800 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
1a810 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
1a820 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
1a830 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
1a840 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1a850 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1a860 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1a870 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
1a880 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1a890 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
1a8a0 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
1a8b0 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
1a8c0 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
1a8d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1a8e0 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
1a8f0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
1a900 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
1a910 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
1a920 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
1a930 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1a940 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
1a950 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
1a960 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
1a970 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
1a980 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
1a990 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
1a9a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1a9b0 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
1a9c0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a9d0 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
1a9e0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
1a9f0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
1aa00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1aa10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1aa20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1aa30 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1aa40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1aa50 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
1aa60 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1aa70 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1aa80 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
1aa90 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
1aaa0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
1aab0 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
1aac0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1aad0 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
1aae0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1aaf0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
1ab00 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1ab10 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1ab20 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1ab30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1ab40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ab50 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
1ab60 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
1ab70 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
1ab80 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
1ab90 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
1aba0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
1abb0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1abc0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1abd0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1abe0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
1abf0 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
1ac00 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
1ac10 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1ac20 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
1ac30 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1ac40 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
1ac50 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
1ac60 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
1ac70 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
1ac80 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
1ac90 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
1aca0 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
1acb0 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
1acc0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
1acd0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
1ace0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
1acf0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
1ad00 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
1ad10 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
1ad20 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
1ad30 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
1ad40 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
1ad50 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
1ad60 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
1ad70 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
1ad80 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
1ad90 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1ada0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
1adb0 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
1adc0 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
1add0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
1ade0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
1adf0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1ae00 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
1ae10 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
1ae20 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
1ae30 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
1ae40 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
1ae50 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1ae60 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
1ae70 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
1ae80 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
1ae90 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
1aea0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
1aeb0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1aec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1aed0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1aee0 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
1aef0 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
1af00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
1af10 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
1af20 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
1af30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
1af40 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1af50 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1af60 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1af70 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1af80 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1af90 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1afa0 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1afb0 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1afc0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1afd0 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1afe0 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1aff0 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1b000 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1b010 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1b020 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1b030 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1b040 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1b050 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1b060 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1b070 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1b080 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1b090 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1b0a0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1b0b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b0c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b0d0 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1b0e0 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1b0f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b100 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1b110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b120 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b130 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1b140 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1b150 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1b160 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1b170 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1b180 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1b190 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1b1a0 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1b1b0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1b1c0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1b1d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1b1e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1b1f0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1b200 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1b210 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1b220 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1b230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b240 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1b250 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1b260 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1b270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b280 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1b290 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1b2a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b2b0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1b2c0 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1b2d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b2e0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1b2f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b300 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b310 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1b320 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1b330 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1b340 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b350 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b370 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1b380 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1b390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b3a0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1b3b0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1b3c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b3d0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1b3e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b3f0 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1b400 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1b420 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1b430 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1b440 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1b450 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b470 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1b480 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b490 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
1b4a0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1b4b0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
1b4c0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
1b4d0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
1b4e0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
1b4f0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
1b500 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
1b510 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
1b520 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
1b530 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
1b540 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
1b550 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1b560 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1b570 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
1b580 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
1b590 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
1b5a0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
1b5b0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
1b5c0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
1b5d0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
1b5e0 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
1b5f0 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
1b600 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
1b610 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
1b620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1b630 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
1b640 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1b650 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
1b660 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
1b670 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
1b680 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
1b690 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
1b6a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
1b6b0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
1b6c0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
1b6d0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
1b6e0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
1b6f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1b700 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1b710 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1b720 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1b730 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1b740 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1b750 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
1b760 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1b770 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
1b780 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1b790 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1b7a0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1b7b0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1b7c0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1b7d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1b7e0 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1b7f0 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1b800 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1b810 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b820 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1b830 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1b840 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1b850 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1b860 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1b870 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1b880 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1b890 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1b8a0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1b8b0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1b8c0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1b8d0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1b8e0 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1b8f0 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1b900 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1b910 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1b920 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1b930 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1b940 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1b950 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1b960 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b970 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1b980 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1b990 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1b9a0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1b9b0 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30  .  if( pBtree==0
1b9c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1b9d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b9e0 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1b9f0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1ba00 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1ba10 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1ba20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ba30 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1ba40 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1ba50 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1ba60 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1ba70 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1ba80 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1ba90 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1baa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1bab0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1bac0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1bad0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1bae0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1baf0 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1bb00 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1bb10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1bb20 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1bb30 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1bb40 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1bb50 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1bb60 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1bb70 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1bb80 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1bb90 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1bba0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1bbb0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1bbc0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1bbd0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1bbe0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1bbf0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1bc00 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1bc10 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1bc20 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1bc30 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1bc40 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1bc50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1bc60 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1bc70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
1bc80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1bc90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1bca0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1bcb0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
1bcc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1bcd0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
1bce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bcf0 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
1bd00 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1bd10 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  (pBt, 0, 0);.  }
1bd20 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1bd30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1bd40 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1bd50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bd60 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
1bd70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d  , tripCode);.  }
1bd80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1bd90 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1bda0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1bdb0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1bdc0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1bdd0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1bde0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bdf0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1be00 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1be10 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1be20 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1be30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be40 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1be50 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1be60 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1be70 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1be80 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1be90 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1bea0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1beb0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1bec0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1bed0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1bee0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1bef0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1bf00 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1bf10 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1bf20 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
1bf30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
1bf40 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1bf50 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1bf60 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
1bf70 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
1bf80 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
1bf90 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
1bfa0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1bfb0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
1bfc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bfd0 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
1bfe0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
1bff0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1c000 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1c010 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
1c020 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
1c030 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1c040 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
1c050 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c060 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1c070 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1c080 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1c090 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c0a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c0b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1c0c0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1c0d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1c0e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1c0f0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
1c100 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1c110 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1c120 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1c130 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1c140 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1c150 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1c160 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1c170 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1c180 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1c190 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1c1a0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1c1b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1c1c0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1c1d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1c1e0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1c1f0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1c200 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1c210 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1c220 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1c230 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1c240 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1c250 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1c260 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1c270 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1c280 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1c290 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1c2a0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1c2b0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1c2c0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1c2d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1c2e0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1c2f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1c300 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1c310 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1c320 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1c330 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1c340 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1c350 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1c360 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1c370 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1c380 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1c390 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1c3a0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1c3b0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1c3c0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1c3d0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1c3e0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1c3f0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1c400 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1c410 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1c420 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1c430 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1c440 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1c450 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1c460 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1c470 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1c480 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1c490 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1c4a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1c4b0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1c4c0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1c4d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1c4e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c4f0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1c500 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c510 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1c520 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c530 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
1c540 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1c550 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
1c560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1c570 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
1c580 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1c590 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
1c5a0 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
1c5b0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1c5c0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1c5d0 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
1c5e0 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
1c5f0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1c600 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
1c610 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
1c620 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
1c630 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
1c640 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
1c650 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
1c660 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
1c670 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
1c680 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
1c690 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1c6a0 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
1c6b0 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
1c6c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1c6d0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
1c6e0 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
1c6f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1c700 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1c710 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
1c720 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
1c730 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c740 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
1c760 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
1c770 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
1c780 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
1c790 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1c7a0 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
1c7b0 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
1c7c0 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
1c7d0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
1c7e0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
1c7f0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
1c800 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
1c810 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
1c820 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
1c830 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
1c840 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
1c850 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
1c860 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
1c870 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
1c880 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
1c890 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1c8a0 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
1c8b0 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
1c8c0 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
1c8d0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
1c8e0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
1c8f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
1c900 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
1c910 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
1c920 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
1c930 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
1c940 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
1c950 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
1c960 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
1c970 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
1c980 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1c990 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1c9a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
1c9b0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1c9c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c9d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1c9e0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1c9f0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ca00 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ca10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1ca20 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
1ca30 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
1ca40 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
1ca50 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
1ca60 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
1ca70 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
1ca80 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
1ca90 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1caa0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
1cab0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1cac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cad0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
1cae0 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
1caf0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1cb00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cb10 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1cb20 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
1cb30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1cb40 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1cb50 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
1cb60 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1cb70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1cb80 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1cb90 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
1cba0 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
1cbb0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
1cbc0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
1cbd0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1cbe0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
1cbf0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
1cc00 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
1cc10 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
1cc20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
1cc30 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
1cc40 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
1cc50 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
1cc60 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
1cc70 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
1cc80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1cc90 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
1cca0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ccb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1ccc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ccd0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1cce0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1ccf0 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1cd00 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1cd10 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1cd20 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1cd30 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1cd40 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1cd50 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1cd60 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1cd70 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1cd80 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1cd90 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1cda0 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1cdb0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1cdc0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1cdd0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1cde0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1cdf0 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1ce00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1ce10 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1ce20 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1ce30 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1ce40 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1ce50 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1ce60 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1ce70 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1ce80 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1ce90 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1cea0 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1ceb0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1cec0 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1ced0 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1cee0 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1cef0 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1cf00 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1cf10 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1cf20 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1cf30 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1cf40 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1cf50 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1cf60 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1cf70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1cf80 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1cf90 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1cfa0 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1cfb0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1cfc0 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1cfd0 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1cfe0 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1cff0 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1d000 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1d010 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1d020 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1d030 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1d040 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1d050 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1d060 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1d070 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1d080 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1d090 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1d0a0 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1d0b0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1d0c0 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1d0d0 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1d0e0 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1d0f0 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1d100 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1d110 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1d120 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1d130 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1d140 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1d150 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1d160 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1d170 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1d180 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1d190 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1d1a0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1d1b0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1d1c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1d1d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d1e0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1d1f0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1d200 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1d210 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1d220 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1d230 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1d240 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d250 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1d260 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1d290 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1d2a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1d2d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1d2e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1d310 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1d320 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1d330 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d340 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1d350 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1d360 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1d370 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
1d380 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
1d3b0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
1d3c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d3d0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
1d3e0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1d3f0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
1d400 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1d410 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1d420 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1d430 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1d440 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
1d450 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1d460 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
1d470 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
1d480 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
1d490 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
1d4a0 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
1d4b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1d4c0 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
1d4d0 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
1d4e0 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
1d4f0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
1d500 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
1d510 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
1d520 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
1d530 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
1d540 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
1d550 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1d560 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
1d570 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
1d580 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
1d590 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d5a0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d5b0 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
1d5c0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1d5d0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1d5e0 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
1d5f0 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
1d600 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1d610 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1d620 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
1d630 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
1d640 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d650 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1d660 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
1d670 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
1d680 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
1d690 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
1d6a0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1d6b0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1d6c0 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1d6d0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1d6e0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1d6f0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1d700 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1d710 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d720 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1d730 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1d740 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1d750 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1d760 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1d770 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1d780 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1d790 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1d7a0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1d7b0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1d7c0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1d7d0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1d7e0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1d7f0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1d800 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1d810 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1d820 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1d830 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1d840 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1d850 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1d860 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1d870 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1d880 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1d890 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1d8a0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1d8b0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1d8c0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1d8d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1d8e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1d8f0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1d900 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1d910 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1d920 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d930 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1d970 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1d9b0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1d9c0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9f0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1da00 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1da10 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1da20 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1da30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1da40 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1da50 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1da60 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1da90 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1daa0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1dab0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1dac0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1dad0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1dae0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1daf0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1db00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1db10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1db20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1db30 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1db40 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1db50 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1db60 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1db70 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1db80 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1db90 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1dba0 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1dbb0 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1dbc0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1dbd0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1dbe0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1dbf0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1dc00 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1dc10 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1dc20 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1dc30 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1dc40 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1dc50 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1dc60 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1dc70 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1dc80 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1dc90 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1dca0 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1dcb0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1dcc0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1dcd0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1dce0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1dcf0 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1dd00 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1dd10 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1dd20 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1dd30 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1dd40 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1dd50 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1dd60 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1dd70 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1dd80 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1dd90 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1dda0 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1ddb0 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1ddc0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1ddd0 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1dde0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1ddf0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1de00 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1de10 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1de20 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1de30 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1de40 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
1de50 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
1de60 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
1de70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
1de80 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
1de90 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
1dea0 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
1deb0 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
1dec0 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
1ded0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
1dee0 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
1def0 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
1df00 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1df10 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
1df20 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
1df30 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
1df40 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
1df50 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
1df60 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
1df70 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
1df80 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
1df90 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1dfa0 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
1dfb0 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
1dfc0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1dfd0 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
1dfe0 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
1dff0 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
1e000 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
1e010 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1e020 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
1e030 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
1e040 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
1e050 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
1e060 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
1e070 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
1e080 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
1e090 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
1e0a0 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1e0b0 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
1e0c0 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
1e0d0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1e0e0 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
1e0f0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e100 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e110 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e120 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1e130 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
1e140 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
1e150 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e160 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
1e170 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
1e180 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
1e190 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
1e1a0 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
1e1b0 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
1e1c0 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
1e1d0 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1e1e0 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1e1f0 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
1e200 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
1e210 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
1e220 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
1e230 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1e240 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
1e250 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1e260 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1e270 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
1e280 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1e290 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e2a0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
1e2b0 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
1e2c0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1e2d0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1e2e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1e2f0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1e300 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1e310 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1e320 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1e330 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1e340 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1e350 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1e360 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1e370 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1e380 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1e390 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1e3a0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1e3b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e3c0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1e3d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1e3e0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1e3f0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1e400 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1e410 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1e420 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1e430 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e440 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1e450 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1e460 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1e470 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1e480 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1e490 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1e4a0 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1e4b0 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1e4c0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1e4d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1e4e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1e4f0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1e500 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1e510 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
1e520 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1e530 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
1e540 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1e550 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1e560 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1e570 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1e580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e590 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1e5a0 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1e5b0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1e5c0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1e5d0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1e5e0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1e5f0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e600 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1e610 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e620 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1e630 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1e640 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1e650 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1e660 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1e670 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1e680 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1e690 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1e6a0 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1e6b0 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1e6c0 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1e6d0 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1e6e0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1e6f0 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1e700 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1e710 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1e720 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1e730 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1e740 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1e750 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1e760 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1e770 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1e780 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1e790 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1e7a0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1e7b0 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1e7c0 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1e7d0 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1e7e0 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1e7f0 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1e800 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1e810 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1e820 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1e830 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1e840 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1e850 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1e860 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1e870 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1e880 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1e890 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1e8a0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1e8b0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1e8c0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1e8d0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1e8e0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1e8f0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1e900 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1e910 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1e920 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1e930 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1e940 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
1e950 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
1e960 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
1e970 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
1e980 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
1e990 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
1e9a0 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
1e9b0 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
1e9c0 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
1e9d0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
1e9e0 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
1e9f0 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
1ea00 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
1ea10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1ea20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1ea30 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
1ea40 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
1ea50 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1ea60 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
1ea70 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1ea80 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1ea90 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1eaa0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
1eab0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1eac0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1ead0 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1eae0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1eaf0 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1eb00 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1eb10 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1eb20 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1eb30 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1eb40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1eb50 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1eb60 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1eb70 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
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 5c 0a 20 20 69             \.  i
1ebb0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1ebc0 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ec00 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1ec10 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ec50 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1ec60 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1ec70 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1ec80 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1ec90 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
1eca0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1ecb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ece0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1ecf0 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1ed40 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1ed50 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1ed90 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1eda0 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1edb0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1edc0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1edd0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1ede0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1edf0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1ee00 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1ee10 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1ee20 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1ee30 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1ee40 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1ee50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1ee60 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1ee70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1ee80 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1ee90 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1eea0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1eeb0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1eec0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1eed0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1eee0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1eef0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1ef00 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1ef10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ef20 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1ef30 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1ef40 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1ef50 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ef60 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1ef70 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1ef80 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1ef90 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1efa0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1efb0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1efc0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1efd0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1efe0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1eff0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1f000 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1f010 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1f020 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1f030 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1f040 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1f050 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1f060 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1f070 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1f080 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1f090 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1f0a0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1f0b0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1f0c0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1f0d0 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1f0e0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1f0f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f100 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1f110 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1f120 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1f130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1f170 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1f180 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f190 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1f1a0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1f1b0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1f1c0 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1f1d0 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1f1e0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1f1f0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1f200 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1f210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f220 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1f230 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1f240 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1f250 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1f260 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1f270 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1f280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1f290 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1f2a0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1f2b0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1f2c0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1f2d0 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1f2e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1f2f0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1f300 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1f310 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1f320 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1f330 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f340 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1f350 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1f360 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1f370 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1f380 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1f390 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1f3a0 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1f3b0 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1f3c0 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1f3d0 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1f3e0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1f3f0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1f400 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1f410 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1f420 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1f430 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1f440 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1f450 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f460 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f470 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f480 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f490 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
1f4a0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
1f4b0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f4c0 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75  fo.nData;.  retu
1f4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f4e0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1f4f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f500 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f510 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1f520 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1f530 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1f540 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1f550 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1f560 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1f570 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1f580 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1f590 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1f5a0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1f5b0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1f5c0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1f5d0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1f5e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1f5f0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1f600 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1f610 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1f620 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1f630 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1f640 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1f650 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1f660 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1f670 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1f680 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1f690 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1f6a0 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1f6b0 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1f6c0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1f6d0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1f6e0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1f6f0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1f700 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1f710 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1f720 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1f730 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1f740 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1f750 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1f760 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1f770 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1f780 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1f790 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1f7a0 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1f7b0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1f7c0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1f7d0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1f7e0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1f7f0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1f800 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1f810 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1f820 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1f830 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1f840 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1f850 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1f860 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1f870 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1f880 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1f890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1f8a0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1f8b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f8d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1f8e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1f8f0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1f900 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1f910 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1f920 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1f930 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1f940 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1f950 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1f960 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1f970 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1f980 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1f990 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1f9a0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1f9b0 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1f9c0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1f9d0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1f9e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f9f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1fa00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1fa10 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1fa20 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1fa30 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1fa40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fa50 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1fa60 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1fa70 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1fa80 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1fa90 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1faa0 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1fab0 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1fac0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1fad0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1fae0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1faf0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1fb00 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1fb10 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1fb20 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1fb30 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1fb40 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1fb50 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1fb60 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1fb70 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1fb80 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1fb90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fba0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1fbb0 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1fbc0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1fbd0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1fbe0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1fbf0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1fc00 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1fc10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fc20 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1fc30 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1fc40 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1fc50 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
1fc60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1fc70 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1fc80 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1fc90 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1fca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fcb0 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1fcc0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1fcd0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1fce0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1fcf0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1fd00 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1fd10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fd20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1fd30 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1fd40 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1fd50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1fd60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1fd70 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1fd80 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1fd90 2c 20 30 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  , 0, (ppPage==0)
1fda0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
1fdb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1fdc0 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pPage==0 );.    
1fdd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fde0 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
1fdf0 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
1fe00 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
1fe10 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78    }..  *pPgnoNex
1fe20 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20  t = next;.  if( 
1fe30 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  ppPage ){.    *p
1fe40 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
1fe50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
1fe60 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
1fe70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63    }.  return (rc
1fe80 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
1fe90 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
1fea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
1feb0 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1fec0 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
1fed0 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
1fee0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
1fef0 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
1ff00 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
1ff10 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
1ff20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
1ff30 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
1ff40 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
1ff50 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
1ff60 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
1ff70 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
1ff80 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
1ff90 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
1ffa0 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
1ffb0 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
1ffc0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1ffd0 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
1ffe0 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
1fff0 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
20000 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
20010 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
20020 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
20030 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20040 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
20050 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
20060 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
20070 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
20080 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
20090 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
200a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
200b0 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
200c0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
200d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
200e0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
200f0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20110 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
20120 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
20130 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
20140 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
20150 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
20160 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
20170 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
20180 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
20190 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
201a0 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
201b0 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
201c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
201d0 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
201e0 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
201f0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
20200 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
20210 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
20220 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
20230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20240 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20250 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
20260 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
20270 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
20280 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
20290 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
202a0 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
202b0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
202c0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
202d0 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
202e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
202f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20310 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
20320 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
20330 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
20340 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
20350 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
20360 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
20370 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a   to. If the eOp.
20380 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
20390 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61  0, this is a rea
203a0 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74  d operation (dat
203b0 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a  a copied into.**
203c0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49   buffer pBuf). I
203d0 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
203e0 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20  , a write (data 
203f0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62  copied from.** b
20400 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a  uffer pBuf)..**.
20410 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
20420 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
20430 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
20440 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
20450 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
20460 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
20470 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
20480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
20490 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
204a0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
204b0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
204c0 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
204d0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
204e0 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
204f0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
20500 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
20510 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
20520 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e   flag is set, an
20530 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  d the current.**
20540 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
20550 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
20560 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
20570 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
20580 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20  allocates space 
20590 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
205a0 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
205b0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
205c0 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20  .** cache array 
205d0 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
205e0 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74  low). Subsequent
205f0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a   calls use this.
20600 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  ** cache to make
20610 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
20620 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
20630 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
20640 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
20650 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
20660 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
20670 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61  allocated, it ma
20680 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  y be.** invalida
20690 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
206a0 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20  r cursor writes 
206b0 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  to the same tabl
206c0 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  e, or if.** the 
206d0 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
206e0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  to a different r
206f0 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ow. Additionally
20700 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  , in auto-vacuum
20710 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f  .** mode, the fo
20720 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d  llowing events m
20730 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ay invalidate an
20740 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
20750 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  ist cache..**.**
20760 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e     * An incremen
20770 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20  tal vacuum,.**  
20780 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61   * A commit in a
20790 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c  uto_vacuum="full
207a0 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43  " mode,.**   * C
207b0 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  reating a table 
207c0 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76  (may require mov
207d0 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ing an overflow 
207e0 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  page)..*/.static
207f0 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f   int accessPaylo
20800 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
20810 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
20820 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
20830 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
20840 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66  rom */.  u32 off
20850 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
20860 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
20870 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
20880 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d  load */.  u32 am
20890 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
208a0 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
208b0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
208c0 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
208d0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
208e0 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
208f0 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65  ffer */ .  int e
20900 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Op              
20910 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e  /* zero to read.
20920 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69   non-zero to wri
20930 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  te. */.){.  unsi
20940 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
20950 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oad;.  int rc = 
20960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32  SQLITE_OK;.  u32
20970 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64   nKey;.  int iId
20980 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
20990 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
209a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
209b0 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
209c0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
209d0 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
209e0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
209f0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
20a00 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
20a10 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
20a20 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
20a30 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
20a40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20a50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20a70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20a80 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
20a90 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
20aa0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20ab0 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
20ac0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
20ad0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
20ae0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
20af0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
20b00 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70  der;.  nKey = (p
20b10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30  Page->intKey ? 0
20b20 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   : (int)pCur->in
20b30 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
20b40 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d   NEVER(offset+am
20b50 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
20b60 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c  nfo.nData) .   |
20b70 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
20b80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
20b90 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
20ba0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
20bb0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
20bc0 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
20bd0 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
20be0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
20bf0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
20c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20c10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20c20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
20c30 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
20c40 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
20c50 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
20c60 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
20c70 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
20c80 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
20c90 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
20ca0 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
20cb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20cc0 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
20cd0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20ce0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
20cf0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
20d00 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
20d10 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
20d20 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
20d30 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
20d40 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
20d50 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
20d60 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
20d70 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
20d80 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
20d90 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
20da0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
20db0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
20dc0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
20dd0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
20de0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
20df0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
20e00 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
20e10 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
20e20 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
20e30 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
20e40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
20e50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20e60 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
20e70 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
20e80 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
20e90 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
20ea0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
20eb0 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
20ec0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
20ed0 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
20ee0 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
20ef0 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
20f00 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
20f10 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
20f20 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
20f30 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
20f40 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
20f50 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
20f60 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
20f70 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
20f80 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
20f90 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
20fa0 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
20fb0 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
20fc0 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
20fd0 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
20fe0 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
20ff0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
21000 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
21010 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
21020 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
21030 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
21040 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
21050 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
21060 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
21070 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
21080 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
21090 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
210a0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
210b0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
210c0 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
210d0 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61  /* nOvfl is alwa
210e0 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66  ys positive.  If
210f0 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66   it were zero, f
21100 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c  etchPayload woul
21110 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  d have.      ** 
21120 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61  been used instea
21130 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  d of this routin
21140 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
21150 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26  ALWAYS(nOvfl) &&
21160 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
21170 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
21180 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
21190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
211a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
211b0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
211c0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
211d0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
211e0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
211f0 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
21200 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
21210 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
21220 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
21230 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
21240 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
21250 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
21260 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
21270 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
21280 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
21290 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
212a0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
212b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
212c0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
212d0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
212e0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
212f0 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
21300 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21310 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
21320 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
21330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21340 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
21350 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
21360 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
21370 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
21380 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
21390 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
213a0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
213b0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
213c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
213d0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
213e0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
213f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
21400 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21410 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
21420 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
21430 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
21440 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
21450 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
21460 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
21470 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
21480 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
21490 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
214a0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
214b0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
214c0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
214d0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
214e0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
214f0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
21500 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
21510 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
21520 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
21530 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
21540 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
21550 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
21560 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
21570 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
21580 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
21590 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
215a0 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
215b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
215c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
215d0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
215e0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
215f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21600 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
21610 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
21620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21630 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
21640 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
21650 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
21660 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
21670 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
21680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
21690 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
216a0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
216b0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
216c0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
216d0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
216e0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
216f0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
21700 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
21710 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
21720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
21730 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
21740 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  AD.        sqlit
21750 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e  e3_file *fd;.#en
21760 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dif.        int 
21770 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
21780 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
21790 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
217a0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
217b0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
217c0 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
217d0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
217e0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
217f0 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
21800 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
21810 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
21820 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
21830 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
21840 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
21850 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
21860 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
21870 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
21880 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
21890 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
218a0 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20      **   3) the 
218b0 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
218c0 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
218d0 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
218e0 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
218f0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
21900 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
21910 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73    5) the databas
21920 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64  e is not a WAL d
21930 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20  atabase,.       
21940 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
21950 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
21960 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
21970 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
21980 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
21990 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
219a0 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
219b0 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
219c0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
219d0 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
219e0 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
219f0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
21a00 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
21a10 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
21a20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
21a30 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a60 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
21a70 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
21a80 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ab0 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
21ac0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
21ad0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
21ae0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
21af0 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
21b00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
21b10 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
21b20 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
21b30 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
21b40 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
21b50 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
21b60 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
21b70 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
21b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
21b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
21ba0 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
21bb0 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
21bc0 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
21bd0 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
21be0 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
21bf0 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
21c00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21c10 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
21c20 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
21c30 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
21c40 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
21c50 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21c60 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
21c70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
21c80 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
21c90 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
21ca0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
21cb0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
21cc0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
21cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
21cf0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
21d00 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
21d10 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
21d20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41      (eOp==0 ? PA
21d30 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45 41 44  GER_ACQUIRE_READ
21d40 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
21d50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
21d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21d70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21d80 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
21d90 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
21da0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
21db0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21dc0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
21dd0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
21de0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
21df0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
21e00 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
21e10 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
21e20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21e30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
21e40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
21e50 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
21e60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21e70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
21e80 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
21e90 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
21ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21ec0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
21ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ee0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21ef0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21f00 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
21f10 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
21f20 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
21f30 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
21f40 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
21f50 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
21f60 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
21f70 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
21f80 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
21f90 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
21fa0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
21fb0 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
21fc0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
21fd0 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
21fe0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
21ff0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22000 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
22010 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
22020 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
22030 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
22040 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
22050 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
22060 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
22070 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
22080 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
22090 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
220a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
220b0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
220c0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
220d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
220e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
220f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22100 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22110 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22120 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22130 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
22140 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22150 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
22160 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22170 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
22180 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22190 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
221a0 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
221b0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
221c0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
221d0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
221e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
221f0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
22200 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
22210 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
22220 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
22230 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
22240 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
22250 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
22260 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
22270 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
22280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22290 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
222a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
222b0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
222c0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
222d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
222e0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
222f0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
22300 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
22310 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
22320 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
22330 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
22340 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
22350 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
22360 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
22370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
22380 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
22390 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
223a0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
223b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
223c0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
223d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
223e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
223f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
22400 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
22410 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
22420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22430 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22440 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22450 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
22460 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
22470 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
22480 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22490 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
224a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
224b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
224c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
224d0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
224e0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
224f0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
22500 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
22510 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
22520 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22530 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22540 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
22550 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
22560 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
22570 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
22580 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
22590 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
225a0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
225b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
225c0 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
225d0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
225e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
225f0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
22600 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
22610 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
22620 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
22630 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
22640 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
22650 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
22660 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
22670 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
22680 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
22690 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
226a0 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
226b0 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
226c0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
226d0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
226e0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
226f0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
22700 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
22710 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
22720 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
22730 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
22740 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
22750 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
22760 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
22770 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
22780 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
22790 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
227a0 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
227b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
227c0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
227d0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
227e0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
227f0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
22800 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
22810 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
22820 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
22830 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
22840 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
22850 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
22860 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
22870 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
22880 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
22890 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
228a0 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
228b0 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
228c0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
228d0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
228e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
228f0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
22900 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
22910 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
22920 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
22930 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
22940 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
22950 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
22960 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
22970 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
22980 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
22990 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
229a0 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
229b0 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
229c0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
229d0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
229e0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
229f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
22a00 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
22a10 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
22a20 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
22a30 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22a40 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22a50 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
22a60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22a70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22a80 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22a90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22aa0 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
22ab0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
22ac0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
22ad0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22ae0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22af0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
22b00 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
22b10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
22b20 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  0) ){.    btreeP
22b30 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
22b40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22b50 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
22b60 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
22b90 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20   }.  aPayload = 
22ba0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
22bb0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
22bc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
22bd0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
22be0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
22bf0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
22c00 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e  {.    nKey = (in
22c10 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
22c20 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
22c30 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
22c40 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
22c50 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
22c60 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
22c70 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
22c80 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
22c90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
22ca0 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c    assert( nLocal
22cb0 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20  <=nKey );.  }.  
22cc0 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a  *pAmt = nLocal;.
22cd0 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61    return aPayloa
22ce0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
22cf0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
22d00 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
22d10 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
22d20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
22d30 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
22d40 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
22d50 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
22d60 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
22d70 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
22d80 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
22d90 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
22da0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
22db0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
22dc0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
22dd0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
22de0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
22df0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
22e00 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
22e10 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
22e20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
22e30 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
22e40 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
22e50 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
22e60 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
22e70 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
22e80 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
22e90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
22ea0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
22eb0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
22ec0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
22ed0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
22ee0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
22ef0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
22f00 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
22f10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
22f20 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
22f30 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
22f40 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
22f50 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
22f60 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
22f70 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
22f80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22f90 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
22fa0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
22fb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
22fc0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22fd0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
22fe0 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
22ff0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23000 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
23010 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
23020 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
23030 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
23040 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn p;.}.const v
23050 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
23060 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
23070 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23080 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
23090 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
230a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
230b0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
230c0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
230d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
230e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
230f0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
23100 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
23110 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23120 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
23130 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
23140 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
23150 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
23160 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
23170 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23180 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
23190 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
231a0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
231b0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
231c0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
231d0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
231e0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
231f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23200 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
23210 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
23220 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
23230 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
23240 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
23250 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
23260 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
23270 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
23280 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
23290 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
232a0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
232b0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
232c0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
232d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
232e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
232f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
23300 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
23310 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
23320 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
23330 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
23340 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
23350 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
23360 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23370 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23390 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
233a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
233b0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
233c0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
233d0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
233e0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
233f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
23400 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
23410 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
23420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23430 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23440 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
23450 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
23460 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
23470 2c 20 28 70 43 75 72 2d 3e 77 72 46 6c 61 67 3d  , (pCur->wrFlag=
23480 3d 30 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29  =0));.  if( rc )
23490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
234a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
234b0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
234c0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
234d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
234e0 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
234f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
23500 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
23510 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
23520 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
23530 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
23540 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
23550 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
23560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23570 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
23580 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23590 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  _OK;.}..#if 0./*
235a0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
235b0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
235c0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
235d0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
235e0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
235f0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
23600 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
23610 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
23620 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
23630 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
23640 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
23650 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
23660 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
23670 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
23680 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
23690 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
236a0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
236b0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
236c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
236d0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
236e0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
236f0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
23700 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
23710 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
23720 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
23730 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
23740 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
23750 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
23760 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
23770 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
23780 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
23790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
237a0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
237b0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
237c0 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
237d0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
237e0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
237f0 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
23800 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
23810 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23820 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
23830 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
23840 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
23850 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
23860 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
23870 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
23880 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
23890 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
238a0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
238b0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
238c0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
238d0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
238e0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
238f0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
23900 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
23910 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
23920 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
23930 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23940 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23950 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23970 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23980 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
23990 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
239a0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
239b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
239c0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20  ur->iPage] );.. 
239d0 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69   /* UPDATE: It i
239e0 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
239f0 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64  ble for the cond
23a00 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20  ition tested by 
23a10 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20  the assert.  ** 
23a20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72  below to be untr
23a30 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
23a40 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
23a50 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63  pt. This can occ
23a60 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63  ur if.  ** one c
23a70 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69  ursor has modifi
23a80 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20  ed page pParent 
23a90 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63  while a referenc
23aa0 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20  e to it is held 
23ab0 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e  .  ** by a secon
23ac0 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20  d cursor. Which 
23ad0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
23ae0 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
23af0 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20   is linked.  ** 
23b00 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
23b10 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
23b20 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74  ure in a corrupt
23b30 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23   database.  */.#
23b40 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72  if 0.  assertPar
23b50 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
23b60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23b70 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
23b80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23b90 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
23ba0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23bb0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
23bc0 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74  .  );.#endif.  t
23bd0 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
23be0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23bf0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
23c00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
23c10 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
23c20 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
23c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23c40 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
23c50 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
23c60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23c70 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23c80 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
23c90 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23ca0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
23cb0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
23cc0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23cd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
23ce0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
23cf0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
23d00 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
23d10 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
23d20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
23d30 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
23d40 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
23d50 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
23d60 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
23d70 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23d80 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
23d90 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
23da0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
23db0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
23dc0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
23dd0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
23de0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
23df0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
23e00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
23e10 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
23e20 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
23e30 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
23e40 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
23e50 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
23e60 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
23e70 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23e80 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
23e90 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
23ea0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
23eb0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
23ec0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
23ed0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
23ee0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
23ef0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
23f00 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
23f10 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
23f20 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
23f30 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
23f40 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
23f50 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
23f60 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
23f70 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
23f80 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
23f90 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
23fa0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
23fb0 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
23fc0 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
23fd0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
23fe0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
23ff0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
24000 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
24010 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
24020 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
24030 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
24040 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
24050 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
24060 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
24070 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
24080 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
24090 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
240a0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
240b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
240c0 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
240d0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
240e0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
240f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24100 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
24110 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
24120 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
24130 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
24140 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24150 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24160 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24170 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24180 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24190 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
241a0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
241b0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
241c0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
241d0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
241e0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
241f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
24200 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
24210 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
24220 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24230 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
24240 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
24250 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
24260 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
24270 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
24280 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
24290 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
242a0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
242b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
242c0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
242d0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
242e0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
242f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
24300 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
24310 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
24320 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
24330 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
24340 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
24350 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
24360 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24370 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
24380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
243a0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
243b0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
243c0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
243d0 61 67 65 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  age[0], 0);.    
243e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
243f0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
24400 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24410 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24430 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
24440 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
24450 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
24460 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
24470 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
24480 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
24490 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65  rsor.    ** expe
244a0 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
244b0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
244c0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
244d0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
244e0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
244f0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
24500 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
24510 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
24520 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65   case,.    ** re
24530 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24540 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a  ORRUPT error.  *
24550 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
24560 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
24570 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72  ntKey==1 || pCur
24580 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
24590 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Key==0 );.    if
245a0 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ( (pCur->pKeyInf
245b0 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50  o==0)!=pCur->apP
245c0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
245d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
245e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
245f0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
24600 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
24610 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
24620 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
24630 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20  type. This must 
24640 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65  be the.  ** case
24650 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   as the call to 
24660 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  this function th
24670 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f  at loaded the ro
24680 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a  ot-page (either.
24690 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f    ** this call o
246a0 72 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76  r a previous inv
246b0 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68  ocation) would h
246c0 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
246d0 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66  ruption .  ** if
246e0 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20   the assumption 
246f0 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
24700 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  nd it is not pos
24710 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c  sible for the fl
24720 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74  ags .  ** byte t
24730 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  o have been modi
24740 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
24750 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e  cursor is holdin
24760 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  g a reference.  
24770 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
24780 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   */.  pRoot = pC
24790 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
247a0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
247b0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
247c0 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Root );.  assert
247d0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20  ( pRoot->isInit 
247e0 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  && (pCur->pKeyIn
247f0 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69  fo==0)==pRoot->i
24800 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72  ntKey );..  pCur
24810 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
24820 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24830 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
24840 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
24850 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
24860 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
24870 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
24880 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
24890 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
248a0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
248b0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
248c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
248d0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
248e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
248f0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
24900 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
24910 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24920 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
24930 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24940 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
24950 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
24960 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24970 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
24980 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
24990 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
249a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
249b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
249c0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
249d0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
249e0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
249f0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
24a00 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
24a10 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
24a20 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
24a30 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
24a40 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
24a50 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
24a60 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
24a70 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
24a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24a90 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
24aa0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24ab0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
24ac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24ad0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24ae0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24af0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24b00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24b10 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24b20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24b30 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24b40 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
24b50 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24b60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
24b70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
24b80 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
24b90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
24ba0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
24bb0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
24bc0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
24bd0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
24be0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
24bf0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24c00 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24c10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24c30 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24c40 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
24c50 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
24c60 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
24c70 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24c80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24c90 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
24ca0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
24cb0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
24cc0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
24cd0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
24ce0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
24cf0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
24d00 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24d10 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
24d20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
24d30 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
24d40 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
24d50 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
24d60 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
24d70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
24d80 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
24d90 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
24da0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
24db0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
24dc0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
24dd0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24de0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
24df0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
24e00 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
24e10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24e20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24e30 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24e40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24e50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24e60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24e70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24e80 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
24e90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
24ea0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24eb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
24ec0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
24ed0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
24ee0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
24ef0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
24f00 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
24f10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
24f20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
24f30 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24f40 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
24f50 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
24f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24f70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24f80 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
24f90 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
24fa0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24fb0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
24fc0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
24fd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24fe0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
24ff0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
25000 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
25010 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
25020 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
25030 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
25040 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
25050 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
25060 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
25070 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
25080 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
25090 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
250a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
250b0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
250c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
250d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
250e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
250f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25100 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25110 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25120 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25130 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
25140 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
25150 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25170 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
25180 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
25190 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
251a0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
251b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
251c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
251d0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
251e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
251f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25200 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25210 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25220 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
25230 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25240 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
25250 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
25260 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25270 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
25280 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
25290 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
252a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
252b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
252c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
252d0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
252e0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
252f0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
25300 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
25310 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
25320 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25330 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
25340 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
25350 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
25360 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
25370 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
25380 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25390 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
253a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
253b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
253c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
253d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
253e0 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
253f0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
25400 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
25410 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
25420 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
25430 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
25440 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
25450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
25460 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
25470 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
25480 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
25490 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
254a0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
254b0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
254c0 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
254d0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
254e0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
254f0 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
25500 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
25510 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25520 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
25530 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
25540 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25550 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25560 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
25570 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25580 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
25590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
255a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
255b0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
255c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
255d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
255e0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
255f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
25600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25610 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
25620 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
25630 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
25640 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25650 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
25660 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25670 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
25680 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
25690 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
256a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
256b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
256c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
256d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
256e0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
256f0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
25700 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
25710 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
25720 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
25730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25740 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
25750 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
25760 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
25770 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
25780 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
25790 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
257a0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
257b0 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
257c0 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
257d0 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
257e0 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
257f0 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
25800 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
25810 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
25820 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
25830 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
25840 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
25850 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
25860 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
25870 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
25880 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
25890 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
258a0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
258b0 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
258c0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
258d0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
258e0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
258f0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
25900 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
25910 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
25920 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
25930 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
25940 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
25950 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
25960 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
25970 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
25980 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
25990 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
259a0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
259b0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
259c0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
259d0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
259e0 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
259f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
25a00 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
25a10 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
25a20 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
25a30 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
25a40 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
25a50 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
25a60 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
25a70 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25a80 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
25a90 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
25aa0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
25ab0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
25ac0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
25ad0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
25ae0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
25af0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25b00 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
25b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
25b30 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
25b40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
25b50 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
25b60 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25b70 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25b80 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25b90 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
25ba0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
25bb0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
25bc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
25bd0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
25be0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
25bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25c00 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
25c10 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
25c20 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
25c30 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
25c40 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
25c50 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
25c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
25c70 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
25c80 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
25c90 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
25ca0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
25cb0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
25cc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ce0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
25cf0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
25d00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
25d10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25d20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25d30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25d40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25d50 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
25d60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
25d70 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
25d80 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
25d90 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
25da0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
25db0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
25dc0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
25dd0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
25de0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
25df0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
25e00 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
25e10 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
25e20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
25e30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25e40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
25e50 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
25e60 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
25e70 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
25e80 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
25e90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
25ea0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
25eb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25ed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25ee0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
25ef0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
25f00 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
25f10 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
25f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25f30 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
25f40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
25f50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
25f60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
25f70 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25f80 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25f90 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25fa0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
25fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25fc0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25fd0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25fe0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
25ff0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
26000 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26010 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
26020 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26030 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26040 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
26050 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26060 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
26070 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
26080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
26090 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
260a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
260b0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
260c0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
260d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
260e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
260f0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
26100 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
26110 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
26120 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a   lwr, upr, idx;.
26130 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
26140 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
26150 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
26160 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
26170 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
26180 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
26190 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
261a0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
261b0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
261c0 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
261d0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
261e0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
261f0 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
26200 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
26210 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
26220 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
26230 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
26240 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
26250 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
26260 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
26270 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
26280 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
26290 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
262a0 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
262b0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
262c0 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
262d0 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
262e0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
262f0 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
26300 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
26310 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
26320 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
26330 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
26340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
26350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26360 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
26370 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
26380 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
26390 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
263a0 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
263b0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
263c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
263d0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
263e0 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20  idx = upr);.    
263f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
26400 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26410 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
26420 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29  x = (upr+lwr)/2)
26430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
26440 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ;;){.      u8 *p
26450 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26470 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
26480 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
26490 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ge */..      ass
264a0 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e  ert( idx==pCur->
264b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
264c0 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  e] );.      pCur
264d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
264e0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
264f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26500 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
26510 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
26520 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
26530 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
26540 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
26550 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
26560 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
26570 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
26580 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
26590 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
265a0 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
265b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
265c0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
265d0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
265e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
265f0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
26600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
26610 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
26620 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
26630 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
26640 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
26650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26660 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26670 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
26680 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
26690 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
266a0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
266b0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
266c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
266d0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
266e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
266f0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
26700 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
26710 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
26720 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
26730 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
26740 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
26750 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
26760 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
26770 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
26780 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
26790 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
267a0 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
267b0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
267c0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
267d0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
267e0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
267f0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
26800 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
26810 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
26820 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
26830 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
26840 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
26850 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
26860 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
26870 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
26880 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
26890 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
268a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
268b0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
268c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
268d0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
268e0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
268f0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
26900 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
26910 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  oad.         /* 
26920 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29  && (pCell+nCell)
26930 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  <pPage->aDataEnd
26940 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26960 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26970 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26980 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
26990 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
269a0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
269b0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
269c0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
269d0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
269e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
269f0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26a00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26a10 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26a20 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26a30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
26a50 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26a60 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
26a70 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
26a80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26a90 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
26aa0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
26ab0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
26ac0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
26ad0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
26ae0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
26af0 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b     /* && (pCell+
26b00 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d  nCell+2)<=pPage-
26b10 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20  >aDataEnd */.   
26b20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26b30 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
26b40 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
26b50 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
26b60 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
26b70 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
26b80 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
26b90 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
26ba0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
26bb0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
26bc0 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
26bd0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
26be0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26bf0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26c00 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
26c10 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
26c20 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
26c30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
26c40 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
26c50 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
26c60 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
26c70 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
26c80 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
26c90 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
26ca0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
26cb0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
26cc0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
26cd0 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
26ce0 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
26cf0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
26d00 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
26d10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
26d20 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
26d30 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
26d40 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
26d50 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
26d60 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
26d70 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
26d80 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
26d90 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
26da0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
26db0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
26dc0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
26dd0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
26de0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
26df0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
26e00 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
26e10 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
26e20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
26e30 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
26e40 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
26e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26e60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26e70 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
26e80 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
26e90 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
26ea0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26eb0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
26ec0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
26ed0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
26ee0 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
26ef0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26f00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26f10 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
26f20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
26f30 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26f40 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26f50 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
26f60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
26f70 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
26f80 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
26f90 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26fa0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
26fb0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
26fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26fd0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
26fe0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26ff0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
27000 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
27010 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
27020 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27040 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27050 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27060 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
27070 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
27080 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
27090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
270a0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
270b0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
270c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
270d0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
270e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
270f0 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
27100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27110 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
27120 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27130 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
27140 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  = (lwr+upr)/2);.
27150 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
27160 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
27170 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
27180 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
27190 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
271a0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
271b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
271c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
271d0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
271e0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
271f0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
27200 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
27210 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
27220 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
27230 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
27240 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
27250 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
27260 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
27270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27280 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
27290 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
272a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
272b0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
272c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
272d0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
272e0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
272f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27300 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27310 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
27320 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27330 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27340 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
27350 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
27360 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
27370 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
27380 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
27390 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
273a0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
273b0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
273c0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
273d0 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
273e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
273f0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
27400 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
27410 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
27420 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
27430 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
27440 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
27450 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
27460 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
27470 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
27480 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27490 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
274a0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
274b0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
274c0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
274d0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
274e0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
274f0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
27500 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
27510 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27520 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
27530 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
27540 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
27550 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
27560 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
27570 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
27580 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
27590 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
275a0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
275b0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
275c0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
275d0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
275e0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
275f0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
27600 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
27610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
27620 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
27630 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
27640 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
27650 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
27660 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
27670 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
27680 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
27690 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
276a0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
276b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
276c0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
276d0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
276e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
276f0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
27700 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
27710 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
27720 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
27730 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
27740 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
27750 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27760 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27770 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27780 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
27790 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
277a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
277b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
277c0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
277d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
277e0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
277f0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
27800 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
27810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27820 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
27830 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
27840 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
27850 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
27860 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
27870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27880 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
27890 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
278a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
278b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
278c0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
278d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
278e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
278f0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
27900 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
27910 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
27920 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
27930 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
27940 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
27950 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
27960 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
27970 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
27980 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
27990 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
279a0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
279b0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
279c0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
279d0 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
279e0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
279f0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
27a00 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
27a10 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
27a20 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
27a30 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
27a40 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
27a50 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
27a60 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
27a70 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
27a80 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
27a90 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
27aa0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
27ab0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
27ac0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
27ad0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
27ae0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
27af0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
27b00 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
27b10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
27b20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27b30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27b40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
27b50 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
27b60 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27b70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
27b80 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
27b90 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
27ba0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27bb0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
27bc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27bd0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27be0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
27bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27c00 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
27c10 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
27c20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
27c30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27c40 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
27c50 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
27c60 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
27c70 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
27c80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27c90 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
27ca0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
27cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
27cc0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
27cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27ce0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27cf0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27d00 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
27d10 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
27d20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
27d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27d40 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
27d50 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
27d60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27d70 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
27d80 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
27d90 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
27da0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
27db0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27dc0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
27dd0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
27de0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
27df0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
27e00 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
27e10 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27e20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27e30 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27e40 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
27e50 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
27e60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27e70 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
27e80 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27e90 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27ea0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
27ec0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27ed0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
27ee0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27ef0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
27f00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
27f20 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
27f30 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
27f40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
27f50 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
27f60 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
27f90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
27fa0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
27fb0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
27fc0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
27fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27fe0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
27ff0 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
28000 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28010 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28020 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
28030 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
28040 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28050 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
28060 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28070 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
28080 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28090 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
280a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
280b0 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
280c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
280d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
280e0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
280f0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
28100 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
28110 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28120 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
28130 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
28140 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28150 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28160 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
28170 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
28180 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
281a0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
281b0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
281c0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
281d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
281e0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
281f0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
28200 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28210 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
28220 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28230 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28240 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
28250 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
28260 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
28270 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
28280 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
28290 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
282a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
282b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
282c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
282d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
282e0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
282f0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
28300 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
28310 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
28320 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
28330 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
28340 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
28350 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
28360 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
28370 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
28380 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
28390 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
283a0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
283b0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
283c0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
283d0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
283e0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
283f0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
28400 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
28410 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
28420 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28430 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
28440 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
28450 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
28460 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
28470 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
28480 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
28490 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
284a0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
284b0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
284c0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
284d0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
284e0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
284f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
28500 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
28510 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
28520 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
28530 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
28540 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
28550 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
28560 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
28570 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
28580 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
28590 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
285a0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
285b0 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
285c0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
285d0 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
285e0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
285f0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
28600 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
28610 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
28620 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
28630 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
28640 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
28650 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
28660 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
28670 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
28680 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
28690 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
286a0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
286b0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
286c0 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
286d0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
286e0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
286f0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
28700 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
28710 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
28720 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
28730 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
28740 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
28750 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
28760 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
28770 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
28780 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
28790 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
287a0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
287b0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
287c0 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
287d0 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
287e0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
287f0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
28800 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
28810 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
28820 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
28830 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
28840 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
28850 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
28860 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
28870 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
28880 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
28890 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
288a0 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
288b0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
288c0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
288d0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
288e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
288f0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
28900 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
28910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
28920 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
28930 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
28940 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
28950 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
28960 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
28970 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
28980 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
28990 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
289a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
289b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
289c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
289d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
289e0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
289f0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
28a00 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
28a10 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
28a20 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
28a30 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
28a40 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
28a50 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
28a60 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
28a70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
28a80 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
28a90 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
28aa0 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
28ab0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
28ac0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28ad0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
28ae0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
28af0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
28b00 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
28b10 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
28b20 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
28b30 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
28b40 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
28b50 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
28b60 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
28b70 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
28b80 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
28b90 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
28ba0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
28bb0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
28bc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
28bd0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
28be0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
28bf0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
28c00 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
28c10 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
28c20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
28c30 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
28c40 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
28c50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
28c60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28c70 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
28c80 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
28c90 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
28ca0 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
28cb0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
28cc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28cd0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
28ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28cf0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
28d00 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
28d10 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
28d20 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
28d30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
28d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28d50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
28d60 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
28d70 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
28d80 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
28d90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28da0 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
28db0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
28dc0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
28dd0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
28de0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
28df0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
28e00 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
28e10 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
28e20 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
28e30 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
28e40 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
28e50 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
28e60 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
28e70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
28e80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28e90 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
28ea0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
28eb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
28ec0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28ed0 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
28ee0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
28ef0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
28f00 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
28f10 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
28f20 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
28f30 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
28f40 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
28f50 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
28f60 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
28f70 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
28f80 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
28f90 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
28fa0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
28fb0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
28fc0 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
28fd0 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
28fe0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
28ff0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
29000 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
29010 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
29020 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
29030 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
29040 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
29050 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
29060 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
29070 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
29080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29090 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
290a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
290b0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
290c0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
290d0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
290e0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
290f0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
29100 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29110 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29120 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29130 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
29140 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
29150 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
29160 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
29170 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29180 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
29190 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
291a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
291b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
291c0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
291d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
291e0 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
291f0 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20  !=0 );..      k 
29200 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
29210 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f  nk->aData[4]); /
29220 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  * # of leaves on
29230 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
29240 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   */.      if( k=
29250 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
29260 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
29270 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
29280 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
29290 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
292a0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
292b0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
292c0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
292d0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
292e0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
292f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
29300 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
29310 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29320 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
29330 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29340 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29350 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
29360 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29380 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29390 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
293a0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
293b0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
293c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
293d0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
293e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
293f0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
29400 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
29410 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
29420 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
29430 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
29440 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
29450 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
29460 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
29470 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
29480 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
29490 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
294a0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
294b0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
294c0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
294d0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
294e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
294f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29500 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29510 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
29520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29530 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
29540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
29550 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
29560 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
29570 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
29580 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
29590 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
295a0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
295b0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
295c0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
295d0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
295e0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
295f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
29600 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
29610 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
29620 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
29630 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29640 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
29650 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
29660 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
29670 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
29680 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
29690 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
296a0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
296b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
296c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
296d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
296e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
296f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
29700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29710 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
29720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29730 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
29740 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
29750 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29760 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29770 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
29780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29790 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
297a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
297b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
297c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
297d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
297e0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
297f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
29800 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
29810 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
29820 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
29830 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
29840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
29870 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
29880 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
29890 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
298a0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
298b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
298c0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
298d0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
298e0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
298f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
29900 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
29910 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
29920 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
29930 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
29940 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
29950 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
29960 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
29970 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
29980 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
29990 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
299a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
299b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
299c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
299d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
299e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
299f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
29a00 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
29a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
29a20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29a30 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
29a40 70 4e 65 77 54 72 75 6e 6b 2c 20 30 2c 20 30 29  pNewTrunk, 0, 0)
29a50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29a80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29a90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
29aa0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29ab0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29ac0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
29ad0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29ae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29b00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
29b10 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
29b20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29b30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29b50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
29b60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
29b70 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
29b80 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
29b90 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
29ba0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
29bb0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
29bc0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
29bd0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
29be0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
29bf0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
29c00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29c10 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
29c20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
29c30 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
29c40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
29c50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29c60 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
29c70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
29c80 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
29c90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29ca0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
29cb0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
29cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29cd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29ce0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
29cf0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29d00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
29d20 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
29d30 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
29d40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29d50 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
29d60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
29d70 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
29d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29d90 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
29da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
29db0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
29dc0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
29dd0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
29de0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
29df0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
29e00 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
29e10 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
29e20 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
29e30 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
29e40 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
29e50 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
29e60 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
29e70 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
29e80 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
29e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
29ea0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
29eb0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
29ec0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
29ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29ee0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
29ef0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
29f00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
29f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
29f20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
29f30 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
29f40 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
29f50 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
29f60 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
29f70 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
29f80 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
29f90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29fa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29fd0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
29ff0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2a000 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2a010 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2a020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2a030 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2a040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a050 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2a060 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2a070 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2a080 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2a090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2a0a0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2a0b0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2a0c0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2a0d0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2a0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2a0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2a100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a120 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2a130 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2a140 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2a150 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2a160 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2a170 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2a180 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2a190 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2a1a0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2a1b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a1c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a1d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a1e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a200 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2a210 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2a220 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2a230 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2a240 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2a250 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2a260 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2a270 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2a280 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2a290 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2a2a0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2a2b0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2a2c0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2a2d0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2a2e0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2a2f0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2a300 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2a310 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a330 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2a340 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2a350 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2a360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a370 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2a380 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a3a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2a3b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2a3c0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2a3d0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2a3e0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2a3f0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2a400 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2a410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2a420 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a430 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2a440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2a450 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2a460 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2a470 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
2a480 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2a490 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
2a4a0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
2a4b0 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20  ntent, 0);.     
2a4c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a4e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a4f0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2a500 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2a510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a540 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2a550 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2a560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2a570 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2a580 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2a590 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a5a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2a5b0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2a5c0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2a5d0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2a5e0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2a5f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2a600 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2a610 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2a620 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2a630 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2a640 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2a650 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2a660 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2a670 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2a680 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2a690 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2a6a0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2a6b0 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2a6c0 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2a6d0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2a6e0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2a6f0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2a700 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2a710 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2a720 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2a730 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2a740 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2a750 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2a760 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2a770 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2a780 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2a790 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2a7a0 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2a7b0 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2a7c0 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2a7d0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2a7e0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2a7f0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2a800 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2a810 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2a820 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2a830 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2a840 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2a850 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2a860 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2a870 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2a880 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2a890 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2a8a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2a8b0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2a8c0 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2a8d0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2a8e0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2a8f0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2a900 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2a910 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2a920 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2a930 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2a940 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2a950 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2a960 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2a970 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2a980 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2a990 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2a9a0 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2a9b0 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2a9c0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2a9d0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2a9e0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2a9f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2aa00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2aa10 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2aa20 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2aa30 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2aa40 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2aa50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2aa60 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2aa70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2aa80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2aa90 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2aaa0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2aab0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2aac0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2aad0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2aae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2aaf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2ab00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2ab10 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2ab20 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2ab30 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2ab40 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2ab50 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2ab60 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2ab70 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2ab80 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2ab90 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2aba0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2abb0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2abc0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2abd0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2abe0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2abf0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2ac00 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2ac10 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2ac20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2ac30 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2ac40 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2ac50 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2ac60 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2ac70 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2ac80 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2ac90 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2aca0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2acb0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2acc0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2acd0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2ace0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2acf0 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nt, 0);.      if
2ad00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ad20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ad30 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
2ad40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ad50 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
2ad60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2ad70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ad80 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
2ad90 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2ada0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
2adb0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2adc0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
2add0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2ade0 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
2adf0 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
2ae00 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
2ae10 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
2ae20 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
2ae30 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
2ae40 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2ae50 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2ae60 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2ae70 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2ae80 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
2ae90 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ent, 0);.    if(
2aea0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2aeb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2aec0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2aed0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2aee0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2aef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2af00 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2af10 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2af20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2af30 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
2af40 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
2af50 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
2af60 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2af70 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2af80 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
2af90 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
2afa0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
2afb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2afc0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
2afd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2afe0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2aff0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2b000 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
2b010 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
2b020 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2b030 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
2b040 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b050 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2b060 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2b070 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2b080 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2b090 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2b0a0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2b0b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2b0c0 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2b0d0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2b0e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2b100 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2b110 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2b120 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b130 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2b140 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2b150 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2b160 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2b170 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2b180 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2b190 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2b1a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2b1b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2b1c0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2b1d0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2b1e0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2b1f0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2b200 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2b210 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2b220 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2b230 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2b240 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2b250 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2b260 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2b270 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2b280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2b290 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2b2a0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2b2b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2b2c0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2b2d0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2b2e0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2b2f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2b300 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2b310 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2b320 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2b330 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2b340 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2b350 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2b380 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2b390 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2b3c0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2b3d0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2b3e0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2b3f0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2b400 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2b410 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2b420 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2b430 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2b440 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2b450 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2b460 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2b470 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b490 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2b4a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2b4b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b4d0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2b4e0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2b4f0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2b500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b510 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2b520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2b530 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2b540 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2b550 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2b560 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2b570 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2b580 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2b590 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2b5a0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2b5b0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2b5c0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2b5d0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2b5e0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2b5f0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2b600 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2b610 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2b620 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b630 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2b640 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2b650 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2b660 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2b670 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2b680 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2b690 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2b6a0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2b6b0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2b6c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2b6d0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2b6e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2b6f0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2b700 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2b710 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2b720 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2b730 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2b740 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2b750 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2b760 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2b770 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2b780 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2b790 70 50 61 67 65 2c 20 30 2c 20 30 29 29 21 3d 30  pPage, 0, 0))!=0
2b7a0 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
2b7b0 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
2b7c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b7d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2b7e0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
2b7f0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2b800 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
2b810 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
2b820 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
2b830 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
2b840 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
2b850 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2b860 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
2b870 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
2b880 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2b890 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
2b8a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2b8b0 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
2b8c0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2b8d0 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
2b8e0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
2b8f0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
2b900 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
2b910 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2b920 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2b930 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
2b940 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
2b950 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
2b960 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
2b970 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
2b980 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
2b990 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
2b9a0 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
2b9b0 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
2b9c0 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
2b9d0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2b9e0 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
2b9f0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2ba00 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
2ba10 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2ba20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
2ba30 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
2ba40 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
2ba50 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
2ba60 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
2ba70 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
2ba80 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
2ba90 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
2baa0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
2bab0 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
2bac0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
2bad0 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
2bae0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
2baf0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2bb00 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2bb10 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
2bb20 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
2bb30 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
2bb40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2bb50 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2bb60 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2bb70 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2bb80 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c 20  nk, &pTrunk, 0, 
2bb90 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2bba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bbb0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2bbc0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2bbd0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2bbe0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2bbf0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2bc00 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2bc10 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2bc20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2bc30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2bc40 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2bc50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bc60 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2bc70 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2bc80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2bc90 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2bca0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2bcb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2bcc0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2bcd0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2bce0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2bcf0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2bd00 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2bd10 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2bd20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bd30 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2bd40 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2bd50 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2bd60 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2bd70 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2bd80 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2bd90 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2bda0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2bdb0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2bdc0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2bdd0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2bde0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2bdf0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2be00 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2be10 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2be20 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2be30 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2be40 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2be50 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2be60 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2be70 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2be80 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2be90 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2bea0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2beb0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2bec0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2bed0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2bee0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2bef0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2bf00 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2bf10 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2bf20 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2bf30 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2bf40 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2bf50 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2bf60 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2bf70 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2bf80 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2bf90 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2bfa0 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2bfb0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2bfc0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2bfd0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2bfe0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2bff0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2c000 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2c010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c020 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2c030 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2c040 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c060 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2c070 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2c080 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2c090 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2c0a0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2c0b0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2c0c0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2c0d0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2c0e0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2c0f0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2c100 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2c110 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2c120 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2c140 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2c150 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2c160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c170 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2c180 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2c190 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2c1a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2c1b0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2c1c0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2c1d0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2c1e0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2c1f0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2c200 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2c210 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2c220 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2c230 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2c240 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2c250 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2c260 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2c270 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2c280 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2c290 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2c2a0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2c2b0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2c2c0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2c2d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2c2e0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2c2f0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2c300 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2c310 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2c320 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2c330 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2c340 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2c350 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2c360 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2c370 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2c380 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 2c  Page, &pPage, 0,
2c390 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
2c3a0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c3b0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2c3c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2c3d0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
2c3e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c3f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2c400 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2c410 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
2c420 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
2c430 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2c440 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
2c450 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2c460 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2c470 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
2c480 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
2c490 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
2c4a0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
2c4b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
2c4c0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
2c4d0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
2c4e0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
2c4f0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2c500 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c510 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
2c520 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
2c530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
2c540 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
2c550 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
2c560 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2c570 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
2c580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
2c590 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
2c5a0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
2c5b0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2c5c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
2c5d0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2c5e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2c5f0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
2c600 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
2c610 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
2c620 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
2c630 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
2c640 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2c650 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2c660 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2c670 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
2c680 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2c690 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
2c6a0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
2c6b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c6c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c6d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2c6e0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2c6f0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2c700 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
2c710 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
2c720 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2c730 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
2c740 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
2c750 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
2c760 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
2c770 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2c780 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
2c790 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
2c7a0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
2c7b0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2c7c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c7d0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
2c7e0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
2c7f0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
2c800 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
2c810 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2c820 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2c830 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2c840 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
2c850 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
2c860 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2c870 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
2c880 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
2c890 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
2c8a0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
2c8b0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
2c8c0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
2c8d0 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
2c8e0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
2c8f0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
2c900 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
2c910 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2c920 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
2c930 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
2c940 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
2c950 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
2c960 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
2c970 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
2c980 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
2c990 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
2c9a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2c9b0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
2c9c0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
2c9d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
2c9e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
2c9f0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2ca00 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2ca10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ca20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ca30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2ca40 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
2ca50 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
2ca60 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
2ca70 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
2ca80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ca90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2caa0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
2cab0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
2cac0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2cad0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
2cae0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
2caf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2cb00 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
2cb10 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
2cb20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
2cb30 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
2cb40 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
2cb50 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
2cb60 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
2cb70 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
2cb80 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
2cb90 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
2cba0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
2cbb0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
2cbc0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
2cbd0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
2cbe0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2cbf0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
2cc00 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
2cc10 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
2cc20 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
2cc30 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
2cc40 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2cc50 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
2cc60 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
2cc70 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
2cc80 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
2cc90 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
2cca0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
2ccb0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
2ccc0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
2ccd0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
2cce0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
2ccf0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
2cd00 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
2cd10 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
2cd20 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
2cd30 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
2cd40 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
2cd50 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
2cd60 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
2cd70 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
2cd80 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
2cd90 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
2cda0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cdb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2cdc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2cdd0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
2cde0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
2cdf0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
2ce00 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
2ce10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ce20 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
2ce30 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2ce40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ce50 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
2ce60 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
2ce70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ce80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2ce90 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
2cea0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
2ceb0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
2cec0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
2ced0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
2cee0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
2cef0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
2cf00 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
2cf10 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
2cf20 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
2cf30 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
2cf40 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
2cf50 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2cf60 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
2cf70 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
2cf80 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2cf90 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
2cfa0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2cfb0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
2cfc0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
2cfd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2cfe0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2cff0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
2d000 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
2d010 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2d020 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
2d030 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
2d040 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
2d050 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
2d060 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
2d070 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
2d080 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2d090 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
2d0a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d0c0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2d0d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
2d0e0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2d0f0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2d100 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
2d110 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
2d120 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
2d130 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2d140 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2d150 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
2d160 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
2d170 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
2d180 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
2d190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d1a0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
2d1b0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
2d1c0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
2d1d0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1f0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
2d200 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
2d210 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
2d220 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
2d230 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
2d240 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
2d250 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
2d260 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
2d270 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
2d280 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
2d290 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
2d2a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d2b0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
2d2c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2d2d0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
2d2e0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
2d2f0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
2d300 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
2d310 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d320 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2d330 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2d340 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
2d350 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2d360 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
2d370 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
2d380 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
2d390 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
2d3a0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
2d3b0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
2d3c0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
2d3d0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
2d3e0 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
2d3f0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2d400 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2d410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2d420 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2d430 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2d440 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
2d450 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
2d460 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
2d470 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
2d480 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
2d490 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
2d4a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
2d4b0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
2d4c0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2d4d0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2d4e0 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2d4f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2d500 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2d510 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2d520 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2d530 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2d540 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2d550 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2d560 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2d570 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2d580 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2d590 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2d5a0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2d5b0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2d5c0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2d5d0 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2d5e0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2d5f0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2d600 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2d610 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2d620 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2d630 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2d640 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2d650 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2d660 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2d670 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2d680 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2d690 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2d6a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d6b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d6c0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2d6d0 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2d6e0 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2d6f0 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2d700 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2d710 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2d720 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2d730 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2d740 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2d750 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2d760 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2d770 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2d780 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2d790 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2d7a0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2d7b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d7c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2d7d0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2d7e0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2d7f0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2d800 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2d810 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2d820 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2d830 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2d840 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2d850 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2d860 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2d870 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2d880 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2d890 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2d8a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d8b0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2d8c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2d8d0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2d8e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d8f0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2d900 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2d910 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2d920 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d930 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2d940 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2d950 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2d960 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2d970 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2d980 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2d990 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2d9a0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2d9b0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2d9c0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2d9d0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2d9e0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2d9f0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2da00 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2da10 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2da20 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2da30 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2da40 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2da50 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2da60 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2da70 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2da80 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2da90 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2daa0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2dab0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2dac0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2dad0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2dae0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2daf0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
2db00 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2db10 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2db20 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2db30 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2db40 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2db50 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2db60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2db70 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2db80 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2db90 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2dba0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2dbb0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2dbc0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2dbd0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2dbe0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2dbf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2dc00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2dc10 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2dc20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2dc30 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2dc40 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2dc50 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2dc60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2dc70 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2dc80 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2dc90 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2dca0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2dcb0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2dcc0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2dcd0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2dce0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2dcf0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2dd00 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2dd10 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2dd20 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2dd30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2dd40 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2dd50 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2dd60 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2dd70 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2dd80 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2dd90 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2dda0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2ddb0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2ddc0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2ddd0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2dde0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2ddf0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2de00 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2de10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2de20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2de30 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2de40 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2de50 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2de60 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2de70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2de80 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2de90 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2dea0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2deb0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2dec0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2ded0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2dee0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2def0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2df00 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2df10 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2df20 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2df30 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2df40 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2df50 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2df60 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2df70 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2df80 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2df90 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2dfa0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2dfb0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2dfc0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2dfd0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2dfe0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2dff0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2e000 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2e010 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e020 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2e030 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2e040 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2e050 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2e060 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2e070 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2e080 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2e090 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2e0a0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2e0b0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2e0c0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2e0d0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2e0e0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2e0f0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2e100 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2e110 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e120 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2e130 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2e140 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2e150 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2e160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2e170 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2e180 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2e190 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2e1a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2e1b0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2e1c0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2e1d0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2e1e0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2e1f0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2e200 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2e210 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2e220 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2e230 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2e240 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2e250 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2e260 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2e270 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2e280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2e2a0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2e2b0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2e2c0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2e2d0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2e2e0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2e2f0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2e300 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2e310 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2e320 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2e330 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2e340 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2e350 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2e360 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2e370 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2e380 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2e390 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2e3a0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2e3b0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e3c0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2e3d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2e3e0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2e3f0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2e400 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2e410 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2e420 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2e430 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2e440 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2e450 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2e460 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2e470 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2e480 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2e490 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2e4a0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2e4b0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2e4c0 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a   *endPtr;     /*
2e4d0 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   End of loop */.
2e4e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2e4f0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
2e500 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
2e510 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
2e520 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
2e530 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
2e540 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
2e550 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
2e560 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2e570 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2e580 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2e590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
2e5a0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
2e5b0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
2e5c0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e5d0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2e5e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2e5f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e600 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2e610 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2e620 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2e630 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
2e640 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
2e650 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
2e660 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2e670 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2e680 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2e690 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2e6a0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2e6b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2e6c0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2e6d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2e6e0 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
2e6f0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2e700 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2e710 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2e720 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2e730 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2e740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e750 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2e760 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2e770 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2e780 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2e790 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2e7a0 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72  rn;.  }.  endPtr
2e7b0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
2e7c0 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  Idx[2*pPage->nCe
2e7d0 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72  ll - 2];.  asser
2e7e0 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2e7f0 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2e800 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2e810 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2e820 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gned */.  while(
2e830 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20   ptr<endPtr ){. 
2e840 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2e850 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a  *(u16*)&ptr[2];.
2e860 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20      ptr += 2;.  
2e870 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2e880 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2e890 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2e8a0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2e8b0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2e8c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2e8d0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2e8e0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2e8f0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2e900 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2e910 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2e920 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2e930 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2e940 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2e950 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2e960 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2e970 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2e980 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2e990 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2e9a0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2e9b0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2e9c0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2e9d0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2e9e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2e9f0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2ea00 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
2ea10 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2ea20 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2ea30 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2ea40 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2ea50 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2ea60 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2ea70 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2ea80 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2ea90 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2eaa0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2eab0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2eac0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2ead0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2eae0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2eaf0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2eb00 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2eb10 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2eb20 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2eb30 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2eb40 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2eb50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2eb60 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2eb70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2eb80 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2eb90 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2eba0 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2ebb0 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2ebc0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2ebd0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2ebe0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2ebf0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2ec00 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2ec10 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2ec20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2ec30 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2ec40 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2ec50 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2ec60 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2ec70 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2ec80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2ec90 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2eca0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2ecb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2ecc0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2ecd0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2ece0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2ecf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2ed00 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2ed10 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2ed20 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2ed30 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2ed40 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2ed50 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2ed60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2ed70 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2ed80 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2ed90 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2eda0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2edb0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
2edc0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2edd0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2ede0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2edf0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2ee00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2ee10 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2ee20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2ee30 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2ee40 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2ee50 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2ee60 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2ee70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2ee80 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2ee90 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2eea0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2eeb0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2eec0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2eed0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2eee0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2eef0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2ef00 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2ef10 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2ef20 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
2ef30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
2ef40 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
2ef50 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
2ef60 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2ef70 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20  u8 *endPtr;     
2ef80 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
2ef90 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  loop */..  int n
2efa0 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
2efb0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20   4 : 0);..  if( 
2efc0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2efd0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2efe0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
2eff0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
2f000 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
2f010 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2f020 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2f030 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2f040 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
2f050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f060 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2f070 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2f080 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
2f090 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
2f0a0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
2f0b0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2f0c0 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
2f0d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2f0e0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2f0f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2f100 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
2f110 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
2f120 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
2f130 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
2f140 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
2f150 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
2f160 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
2f170 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
2f180 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
2f190 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
2f1a0 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
2f1b0 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
2f1c0 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
2f1d0 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
2f1e0 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
2f1f0 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
2f200 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
2f210 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
2f220 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
2f230 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
2f240 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
2f250 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
2f260 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2f270 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
2f280 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
2f290 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
2f2a0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
2f2b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2f2c0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2f2d0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2f2e0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2f2f0 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2f300 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2f310 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2f320 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2f330 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2f340 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2f350 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2f360 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2f370 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2f380 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2f390 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2f3a0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
2f3b0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
2f3c0 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
2f3d0 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
2f3e0 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
2f3f0 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
2f400 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
2f410 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2f420 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f430 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2f440 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2f450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f460 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2f470 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2f480 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2f490 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f4a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2f4b0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2f4c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2f4d0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2f4e0 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2f4f0 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2f500 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2f510 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2f520 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2f530 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2f540 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2f550 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2f560 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2f570 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2f580 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2f590 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2f5a0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2f5b0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2f5c0 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2f5d0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2f5e0 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2f5f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2f600 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2f610 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2f620 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
2f630 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2f640 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
2f650 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
2f660 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
2f670 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
2f680 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
2f690 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
2f6a0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2f6b0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
2f6c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f6d0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
2f6e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74  d);.    }.    pt
2f6f0 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a  r = &data[end];.
2f700 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61      endPtr = &da
2f710 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73  ta[ins];.    ass
2f720 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2f730 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2f740 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2f750 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2f760 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68  ligned */.    wh
2f770 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20  ile( ptr>endPtr 
2f780 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29  ){.      *(u16*)
2f790 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74  ptr = *(u16*)&pt
2f7a0 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
2f7b0 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   -= 2;.    }.   
2f7c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2f7d0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
2f7e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
2f7f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2f800 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2f810 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2f820 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f830 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
2f840 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
2f850 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2f860 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
2f870 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2f880 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2f890 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
2f8a0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
2f8b0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2f8c0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2f8d0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
2f8e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
2f8f0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
2f900 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
2f910 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f920 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2f930 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
2f940 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
2f950 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
2f960 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
2f970 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
2f980 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
2f990 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
2f9a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2f9b0 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
2f9c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2f9d0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
2f9e0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
2f9f0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
2fa00 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
2fa10 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
2fa20 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
2fa30 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
2fa40 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2fa50 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
2fa60 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
2fa70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2fa80 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
2fa90 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2faa0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2fab0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2fac0 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f  *pCellptr;     /
2fad0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2fae0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
2faf0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
2fb00 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2fb10 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
2fb20 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  dy */.  u8 * con
2fb30 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
2fb40 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
2fb50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2fb60 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  o data for pPage
2fb70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2fb80 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2fb90 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
2fba0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
2fbb0 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a  eader on pPage *
2fbc0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55  /.  const int nU
2fbd0 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70  sable = pPage->p
2fbe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20  Bt->usableSize; 
2fbf0 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
2fc00 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  f page */..  ass
2fc10 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2fc20 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
2fc30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fc40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2fc50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2fc60 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d   assert( nCell>=
2fc70 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74  0 && nCell<=(int
2fc80 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  )MX_CELL(pPage->
2fc90 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  pBt).           
2fca0 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c   && (int)MX_CELL
2fcb0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2fcc0 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  921);.  assert( 
2fcd0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2fce0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2fcf0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2fd00 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2fd10 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2fd20 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2fd30 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2fd40 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2fd50 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2fd60 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  ( get2byteNotZer
2fd70 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  o(&data[hdr+5])=
2fd80 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
2fd90 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65  Cellptr = &pPage
2fda0 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
2fdb0 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2fdc0 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2fdd0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2fde0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20  ; i--){.    u16 
2fdf0 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  sz = aSize[i];. 
2fe00 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2fe10 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2fe20 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79  = sz;.    put2by
2fe30 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2fe40 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2fe50 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2fe60 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  y], apCell[i], s
2fe70 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  z);.  }.  put2by
2fe80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2fe90 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
2fea0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2feb0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
2fec0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2fed0 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
2fee0 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
2fef0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
2ff00 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
2ff10 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2ff20 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
2ff30 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
2ff40 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
2ff50 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
2ff60 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
2ff70 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
2ff80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
2ff90 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2ffa0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
2ffb0 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
2ffc0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2ffd0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2ffe0 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
2fff0 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
30000 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
30010 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
30020 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
30030 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
30040 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
30050 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
30060 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
30070 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
30080 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
30090 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
300a0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
300b0 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
300c0 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
300d0 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
300e0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
300f0 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
30100 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
30110 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
30120 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
30130 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
30140 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
30150 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
30160 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
30170 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
30180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30190 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
301a0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
301b0 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
301c0 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
301d0 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
301e0 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
301f0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
30200 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
30210 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
30220 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
30230 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
30240 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
30250 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
30260 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
30270 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
30280 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
30290 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
302a0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
302b0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
302c0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
302d0 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
302e0 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
302f0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
30300 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
30310 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
30320 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
30330 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
30340 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
30350 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
30360 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
30370 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
30380 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
30390 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
303a0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
303b0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
303c0 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
303d0 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
303e0 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
303f0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
30400 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
30410 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
30420 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
30430 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
30440 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
30450 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
30460 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
30470 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
30480 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
30490 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
304a0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
304b0 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
304c0 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
304d0 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
304e0 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
304f0 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
30500 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
30510 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
30520 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
30530 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
30540 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
30550 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
30560 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
30570 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
30580 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
30590 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
305a0 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
305b0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
305c0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
305d0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
305e0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
305f0 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
30600 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
30610 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
30620 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
30630 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
30640 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
30650 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
30660 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
30670 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
30680 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
30690 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
306a0 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
306b0 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
306c0 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
306d0 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
306e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
306f0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
30700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
30710 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
30720 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30750 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
30760 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30780 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
30790 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
307a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
307b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
307c0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
307d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
307e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
307f0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
30800 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
30810 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
30820 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
30830 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
30840 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
30850 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
30860 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
30870 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
30880 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20  age->nCell==0 ) 
30890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
308a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
308b0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
308c0 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
308d0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
308e0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
308f0 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
30900 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
30910 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
30920 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
30930 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
30940 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
30950 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
30960 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
30970 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
30980 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
30990 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
309a0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
309b0 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
309c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
309d0 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
309e0 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
309f0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
30a00 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  = pPage->apOvfl[
30a10 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  0];.    u16 szCe
30a20 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
30a30 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
30a40 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
30a50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30a60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30a70 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
30a80 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
30a90 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
30aa0 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
30ab0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
30ac0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
30ad0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
30ae0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
30af0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
30b00 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
30b10 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
30b20 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
30b30 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
30b40 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
30b50 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
30b60 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
30b70 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
30b80 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
30b90 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
30ba0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
30bb0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
30bc0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
30bd0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
30be0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
30bf0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
30c00 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
30c10 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
30c20 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
30c30 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
30c40 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
30c50 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
30c60 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
30c70 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
30c80 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
30c90 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
30ca0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
30cb0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
30cc0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
30cd0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
30ce0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
30cf0 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
30d00 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
30d10 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
30d20 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
30d30 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
30d40 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
30d50 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
30d60 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
30d70 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
30d80 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
30d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
30da0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
30db0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
30dc0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
30dd0 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
30de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30df0 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
30e00 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
30e10 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
30e20 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
30e30 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
30e40 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
30e50 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
30e60 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
30e70 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
30e80 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
30e90 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
30ea0 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
30eb0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
30ec0 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
30ed0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
30ee0 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
30ef0 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
30f00 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
30f10 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
30f20 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
30f30 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
30f40 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
30f50 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
30f60 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
30f70 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
30f80 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
30f90 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
30fa0 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
30fb0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
30fc0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
30fd0 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
30fe0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
30ff0 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
31000 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
31010 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
31020 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
31030 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
31040 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
31050 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
31060 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
31070 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
31080 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
31090 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
310a0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
310b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
310c0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
310d0 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
310e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
310f0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
31100 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
31110 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
31120 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
31130 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
31140 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
31150 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
31160 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
31170 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
31180 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
31190 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
311a0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
311b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
311c0 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
311d0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
311e0 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
311f0 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
31200 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
31210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31220 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
31230 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
31240 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
31250 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
31260 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
31270 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
31280 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
31290 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
312a0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
312b0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
312c0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
312d0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
312e0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
312f0 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
31300 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
31310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31320 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
31330 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
31340 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
31350 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31360 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
31370 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
31380 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
31390 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
313a0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
313b0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
313c0 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
313d0 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
313e0 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
313f0 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
31400 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
31410 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
31420 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
31430 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
31440 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
31450 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
31460 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
31470 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
31480 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
31490 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
314a0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
314b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
314c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
314d0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
314e0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
314f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
31500 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
31510 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
31520 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
31530 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
31540 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
31550 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
31560 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
31570 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
31580 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
31590 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
315a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
315b0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
315c0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
315d0 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
315e0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
315f0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
31600 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
31610 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
31620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31630 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31640 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
31650 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
31660 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
31670 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
31680 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
31690 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
316a0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
316b0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
316c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
316d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
316e0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
316f0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
31700 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
31710 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
31720 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
31730 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
31740 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
31750 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
31760 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
31770 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
31780 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
31790 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
317a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
317b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
317c0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
317d0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
317e0 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
317f0 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
31800 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
31810 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
31820 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
31830 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
31840 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
31850 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
31860 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
31870 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
31880 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
31890 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
318a0 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
318b0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
318c0 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
318d0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
318e0 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
318f0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
31900 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
31910 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
31920 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
31930 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31940 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
31950 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
31960 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
31970 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
31980 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
31990 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
319a0 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29  .apOvfl[] array)
319b0 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63  , they are not c
319c0 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a  opied to pTo. .*
319d0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
319e0 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20  rning, page pTo 
319f0 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64  is reinitialized
31a00 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74   using btreeInit
31a10 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
31a20 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
31a30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31a40 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
31a50 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
31a60 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
31a70 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
31a80 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
31a90 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
31aa0 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
31ab0 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
31ac0 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
31ad0 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
31ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31af0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
31b00 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20  MemPage *pFrom, 
31b10 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e  MemPage *pTo, in
31b20 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
31b30 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
31b40 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
31b50 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
31b60 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75  From->pBt;.    u
31b70 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
31b80 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
31b90 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
31ba0 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b  To = pTo->aData;
31bb0 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
31bc0 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d  FromHdr = pFrom-
31bd0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
31be0 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
31bf0 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
31c00 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
31c10 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
31c20 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
31c30 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
31c40 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
31c50 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
31c60 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
31c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
31c80 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
31c90 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e  omHdr+5]) <= (in
31ca0 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
31cb0 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  e );.  .    /* C
31cc0 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e  opy the b-tree n
31cd0 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ode content from
31ce0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
31cf0 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20  age pTo. */.    
31d00 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
31d10 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
31d20 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +5]);.    memcpy
31d30 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
31d40 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
31d50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
31d60 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ta);.    memcpy(
31d70 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61  &aTo[iToHdr], &a
31d80 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20  From[iFromHdr], 
31d90 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65  pFrom->cellOffse
31da0 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65  t + 2*pFrom->nCe
31db0 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ll);.  .    /* R
31dc0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
31dd0 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
31de0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31df0 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
31e00 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20  re.    ** match 
31e10 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
31e20 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
31e30 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75   of pTo can actu
31e40 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a  ally fail under.
31e50 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62      ** fairly ob
31e60 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e  scure circumstan
31e70 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ces, even though
31e80 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66   it is a copy of
31e90 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   initialized .  
31ea0 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e    ** page pFrom.
31eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  .    */.    pTo-
31ec0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
31ed0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
31ee0 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66  age(pTo);.    if
31ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31f00 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31f10 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
31f20 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
31f30 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
31f40 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
31f50 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
31f60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31f70 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
31f80 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
31f90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
31fa0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
31fb0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
31fc0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
31fd0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
31fe0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31ff0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
32000 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
32010 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
32020 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
32030 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
32040 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
32050 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
32060 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
32070 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
32080 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
32090 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
320a0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
320b0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
320c0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
320d0 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
320e0 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
320f0 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
32100 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
32110 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
32120 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
32130 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
32140 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
32150 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32160 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
32170 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
32180 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
32190 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
321a0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
321b0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
321c0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
321d0 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
321e0 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
321f0 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
32200 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
32210 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
32220 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
32230 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
32240 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
32250 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
32260 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
32270 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
32280 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
32290 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
322a0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
322b0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
322c0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
322d0 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
322e0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
322f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
32300 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
32310 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
32320 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
32330 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
32340 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
32350 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
32360 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
32370 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
32380 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
32390 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
323a0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
323b0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
323c0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
323d0 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
323e0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
323f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32400 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
32410 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
32420 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
32430 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
32440 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
32450 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
32460 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
32470 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
32480 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
32490 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
324a0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
324b0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
324c0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
324d0 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
324e0 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
324f0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
32500 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
32510 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
32520 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
32530 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
32540 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
32550 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
32560 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
32570 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
32580 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
32590 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
325a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
325b0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
325c0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
325d0 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
325e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
325f0 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
32600 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
32610 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
32620 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
32630 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
32640 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
32650 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
32660 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
32670 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
32680 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
32690 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
326a0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
326b0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
326c0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
326d0 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
326e0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
326f0 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
32700 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
32710 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
32720 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
32730 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
32740 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
32750 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
32760 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
32770 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
32780 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
32790 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
327a0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
327b0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
327c0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
327d0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
327e0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
327f0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
32800 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
32810 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
32820 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
32830 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
32840 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
32850 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
32860 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
32870 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
32880 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
32890 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
328a0 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26  C_VER >= 1700 &&
328b0 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29   defined(_M_ARM)
328c0 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a  .#pragma optimiz
328d0 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69  e("", off).#endi
328e0 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  f.static int bal
328f0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
32900 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
32910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32920 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
32930 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
32940 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
32950 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
32960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32970 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
32980 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
32990 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
329a0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
329b0 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
329c0 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
329d0 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
329e0 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
329f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
32a00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
32a10 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
32a20 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e  oot-page */.  in
32a30 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20  t bBulk         
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a50 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61   True if this ca
32a60 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  ll is part of a 
32a70 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a  bulk load */.){.
32a80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
32a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32aa0 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
32ab0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
32ac0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
32ad0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32ae0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
32af0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
32b00 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
32b10 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
32b20 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
32b30 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
32b40 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
32b50 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
32b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32b70 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
32b80 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
32b90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
32ba0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32bb0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
32bc0 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
32bd0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
32be0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
32bf0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
32c00 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
32c10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
32c20 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
32c30 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
32c40 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
32c50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32c60 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
32c70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
32c80 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
32c90 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
32ca0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
32cb0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
32cc0 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
32cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ce0 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
32cf0 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
32d00 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
32d10 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
32d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
32d30 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
32d40 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
32d50 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
32d60 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
32d70 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
32d80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
32d90 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
32da0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32db0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
32dc0 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
32dd0 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
32de0 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
32df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
32e00 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
32e10 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
32e20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
32e30 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
32e40 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
32e50 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
32e60 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
32e70 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
32e80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
32e90 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
32ea0 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
32eb0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
32ec0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
32ed0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
32ee0 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
32ef0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
32f00 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
32f10 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
32f20 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
32f30 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
32f40 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
32f50 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
32f60 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
32f70 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
32f80 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
32f90 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
32fa0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
32fb0 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
32fc0 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
32fd0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
32fe0 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
32ff0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
33000 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
33010 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
33020 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
33030 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
33040 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
33050 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
33060 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
33070 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
33080 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
33090 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
330a0 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
330b0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
330c0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
330d0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
330e0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
330f0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33110 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
33120 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
33130 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
33140 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
33150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
33160 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
33170 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
33180 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331a0 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
331b0 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
331c0 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
331d0 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
331e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
331f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33200 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
33210 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33220 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33230 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
33240 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
33250 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
33260 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
33270 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
33280 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
33290 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
332a0 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
332b0 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
332c0 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
332d0 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
332e0 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
332f0 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
33300 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
33310 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
33320 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
33330 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
33340 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
33350 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
33360 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
33370 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
33380 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
33390 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
333a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
333b0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
333c0 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
333d0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
333e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
333f0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
33400 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
33410 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e  iOvfl[0]==iParen
33420 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
33430 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
33440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33450 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
33460 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
33470 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
33480 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
33490 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
334a0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
334b0 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
334c0 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
334d0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
334e0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
334f0 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
33500 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
33510 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
33520 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
33530 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
33540 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
33550 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
33560 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
33570 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
33580 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
33590 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
335a0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
335b0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
335c0 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
335d0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
335e0 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
335f0 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
33600 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33610 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
33620 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
33630 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
33640 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
33650 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
33660 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
33670 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
33680 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
33690 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
336a0 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
336b0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
336c0 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
336d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
336e0 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
336f0 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
33700 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
33710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33720 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c  sert( bBulk==0 |
33730 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20  | bBulk==1 );.  
33740 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
33750 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
33760 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
33770 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
33780 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
33790 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
337a0 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b  Div = i-2+bBulk;
337b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
337c0 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d    assert( bBulk=
337d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69  =0 );.      nxDi
337e0 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
337f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
33800 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e  2-bBulk;.  }.  n
33810 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28  Old = i+1;.  if(
33820 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e   (i+nxDiv-pParen
33830 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70  t->nOverflow)==p
33840 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
33850 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70  .    pRight = &p
33860 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
33870 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
33880 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +8];.  }else{.  
33890 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43    pRight = findC
338a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
338b0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
338c0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20  verflow);.  }.  
338d0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
338e0 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65  pRight);.  while
338f0 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ( 1 ){.    rc = 
33900 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
33910 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64  Bt, pgno, &apOld
33920 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  [i], 0);.    if(
33930 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
33940 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
33950 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
33960 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
33970 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33980 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
33990 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
339a0 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
339b0 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
339c0 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
339d0 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
339e0 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
339f0 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20  rent->aiOvfl[0] 
33a00 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
33a10 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
33a20 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
33a30 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  t->apOvfl[0];.  
33a40 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
33a50 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
33a60 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
33a70 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
33a80 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
33a90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
33aa0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
33ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
33ac0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
33ad0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
33ae0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33af0 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
33b00 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
33b10 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
33b20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
33b30 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
33b40 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
33b50 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
33b60 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
33b70 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
33b80 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
33b90 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
33ba0 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
33bb0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
33bc0 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
33bd0 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
33be0 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
33bf0 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
33c00 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
33c10 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
33c20 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
33c30 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
33c40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
33c50 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
33c60 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
33c70 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
33c80 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
33c90 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
33ca0 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
33cb0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
33cc0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33cd0 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65  ** But not if we
33ce0 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64   are in secure-d
33cf0 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73  elete mode. In s
33d00 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
33d10 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
33d20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
33d30 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
33d40 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
33d50 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
33d60 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33d70 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
33d80 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
33d90 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
33da0 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
33db0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
33dc0 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
33dd0 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
33de0 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
33df0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
33e00 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
33e10 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46     if( pBt->btsF
33e20 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
33e30 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
33e40 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20      int iOff;.. 
33e50 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51         iOff = SQ
33e60 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
33e70 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49  apDiv[i]) - SQLI
33e80 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50  TE_PTR_TO_INT(pP
33e90 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
33ea0 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
33eb0 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29  +szNew[i])>(int)
33ec0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33ee0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33ef0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
33f00 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
33f10 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
33f20 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
33f30 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
33f40 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
33f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33f60 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
33f70 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70  lSpace[iOff], ap
33f80 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d  Div[i], szNew[i]
33f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44  );.          apD
33fa0 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70  iv[i] = &aOvflSp
33fb0 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61  ace[apDiv[i]-pPa
33fc0 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20  rent->aData];.  
33fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33fe0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
33ff0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
34000 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34010 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72  ow, szNew[i], &r
34020 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
34030 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
34040 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
34050 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
34060 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
34070 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
34080 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
34090 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
340a0 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
340b0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
340c0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
340d0 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
340e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
340f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
34100 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
34110 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
34120 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
34130 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
34140 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
34150 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
34160 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
34170 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
34180 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
34190 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
341a0 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341c0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
341d0 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
341e0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34200 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34210 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
34220 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
34230 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
34240 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
34250 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
34260 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
34270 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34280 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
34290 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
342a0 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
342b0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
342c0 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
342d0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
342e0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
342f0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
34300 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
34310 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
34320 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
34330 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
34340 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
34350 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
34360 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
34370 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
34380 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
34390 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
343a0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
343b0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
343c0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
343d0 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64 65  emove the divide
343e0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r cells.  ** fro
343f0 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
34400 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
34410 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
34420 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
34430 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
34440 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
34450 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
34460 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
34470 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
34480 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
34490 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
344a0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
344b0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
344c0 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
344d0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
344e0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
344f0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
34500 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
34510 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
34520 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
34530 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
34540 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
34550 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
34560 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
34570 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
34580 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
34590 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
345a0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
345b0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
345c0 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
345d0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
345e0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
345f0 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
34600 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65   keys..  */.  le
34610 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61  afCorrection = a
34620 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b  pOld[0]->leaf*4;
34630 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70  .  leafData = ap
34640 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b  Old[0]->hasData;
34650 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
34660 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ld; i++){.    in
34670 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20  t limit;.    .  
34680 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
34690 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
346a0 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
346b0 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61  the i'th origina
346c0 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  l sibling.    **
346d0 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
346e0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
346f0 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
34700 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
34710 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
34720 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
34730 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
34740 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
34750 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  in the.    ** pr
34760 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
34770 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
34780 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
34790 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  d = apCopy[i] = 
347a0 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63  (MemPage*)&aSpac
347b0 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
347c0 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d   + k*i];.    mem
347d0 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b  cpy(pOld, apOld[
347e0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
347f0 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e  ge));.    pOld->
34800 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
34810 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pOld[1];.    mem
34820 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c  cpy(pOld->aData,
34830 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
34840 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
34850 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70  ;..    limit = p
34860 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
34870 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
34880 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
34890 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 66  low>0 ){.      f
348a0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
348b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
348c0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
348d0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
348e0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
348f0 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
34900 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
34910 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
34920 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
34930 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
34940 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  ell]);.        n
34950 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
34960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34970 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c   u8 *aData = pOl
34980 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  d->aData;.      
34990 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20 70  u16 maskPage = p
349a0 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20  Old->maskPage;. 
349b0 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66       u16 cellOff
349c0 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c  set = pOld->cell
349d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66 6f  Offset;.      fo
349e0 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
349f0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  j++){.        as
34a00 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
34a10 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
34a20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
34a30 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61 74   findCellv2(aDat
34a40 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c  a, maskPage, cel
34a50 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20  lOffset, j);.   
34a60 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
34a70 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
34a80 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
34a90 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  ell]);.        n
34aa0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
34ab0 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20 20      }       .   
34ac0 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26   if( i<nOld-1 &&
34ad0 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20   !leafData){.   
34ae0 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36     u16 sz = (u16
34af0 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  )szNew[i];.     
34b00 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
34b10 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
34b20 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34b30 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
34b40 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65   = sz;.      pTe
34b50 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53  mp = &aSpace1[iS
34b60 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53  pace1];.      iS
34b70 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace1 += sz;.   
34b80 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
34b90 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
34ba0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34bb0 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e 74   iSpace1 <= (int
34bc0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
34bd0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
34be0 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Temp, apDiv[i], 
34bf0 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  sz);.      apCel
34c00 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70  l[nCell] = pTemp
34c10 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b  +leafCorrection;
34c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
34c30 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
34c40 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69   || leafCorrecti
34c50 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73  on==4 );.      s
34c60 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
34c70 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c  zCell[nCell] - l
34c80 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
34c90 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
34ca0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
34cb0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
34cc0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
34cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
34ce0 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  d->hdrOffset==0 
34cf0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
34d00 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
34d10 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
34d20 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
34d30 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
34d40 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
34d50 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
34d60 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
34d70 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
34d80 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pOld->aData[8],
34d90 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
34da0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34db0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
34dc0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==4 );.        i
34dd0 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  f( szCell[nCell]
34de0 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
34df0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
34e00 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
34e10 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
34e20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  */.          szC
34e30 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a  ell[nCell] = 4;.
34e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34e50 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  }.      nCell++;
34e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34e70 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
34e80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
34e90 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
34ea0 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
34eb0 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
34ec0 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
34ed0 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
34ee0 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
34ef0 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
34f00 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
34f10 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
34f20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
34f30 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
34f40 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
34f50 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
34f60 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
34f70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
34f80 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
34f90 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
34fa0 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
34fb0 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
34fc0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
34fd0 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
34fe0 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
34ff0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
35000 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
35010 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
35020 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
35030 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
35040 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
35050 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
35060 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
35070 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
35080 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
35090 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
350a0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
350b0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
350c0 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
350d0 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
350e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
350f0 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
35100 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
35110 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
35120 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
35130 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
35140 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
35150 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
35160 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
35170 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
35180 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
35190 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
351a0 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
351b0 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
351c0 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
351d0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
351e0 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
351f0 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
35200 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
35210 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
35220 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
35230 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
35240 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42  ;.      if( k>NB
35250 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  +1 ){ rc = SQLIT
35260 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
35270 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35280 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20  anup; }.    }.  
35290 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73  }.  szNew[k] = s
352a0 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65  ubtotal;.  cntNe
352b0 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  w[k] = nCell;.  
352c0 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  k++;..  /*.  ** 
352d0 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70  The packing comp
352e0 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  uted by the prev
352f0 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69  ious block is bi
35300 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20  ased toward the 
35310 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e  siblings.  ** on
35320 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20   the left side. 
35330 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e   The left siblin
35340 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65  gs are always ne
35350 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65  arly full, while
35360 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d   the.  ** right-
35370 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67  most sibling mig
35380 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  ht be nearly emp
35390 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20  ty.  This block 
353a0 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73  of code attempts
353b0 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20  .  ** to adjust 
353c0 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73  the packing of s
353d0 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61  iblings to get a
353e0 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e   better balance.
353f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
35400 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f  adjustment is mo
35410 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d  re than an optim
35420 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61  ization.  The pa
35430 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68  cking above migh
35440 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74  t.  ** be so out
35450 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74   of balance as t
35460 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46  o be illegal.  F
35470 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
35480 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
35490 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
354a0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
354b0 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d  y.  This adjustm
354c0 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f  ent is not optio
354d0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  nal..  */.  for(
354e0 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  i=k-1; i>0; i--)
354f0 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68  {.    int szRigh
35500 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f  t = szNew[i];  /
35510 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
35520 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  g on the right *
35530 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74  /.    int szLeft
35540 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f   = szNew[i-1]; /
35550 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e  * Size of siblin
35560 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  g on the left */
35570 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20  .    int r;     
35580 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35590 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20  x of right-most 
355a0 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62  cell in left sib
355b0 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ling */.    int 
355c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
355d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
355e0 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  t cell to the le
355f0 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c  ft of right sibl
35600 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20  ing */..    r = 
35610 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
35620 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d  .    d = r + 1 -
35630 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61   leafData;.    a
35640 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c  ssert( d<nMaxCel
35650 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ls );.    assert
35660 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( r<nMaxCells );
35670 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69  .    while( szRi
35680 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  ght==0 .       |
35690 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a 52  | (!bBulk && szR
356a0 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
356b0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
356c0 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a  [r]+2)) .    ){.
356d0 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
356e0 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
356f0 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
35700 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
35710 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
35720 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
35730 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
35740 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
35750 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
35760 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
35770 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
35780 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
35790 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
357a0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
357b0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
357c0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
357d0 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20  pPage is.  ** a 
357e0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
357f0 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
35800 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
35810 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
35820 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
35830 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
35840 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
35850 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20  hat page..  **. 
35860 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65   ** UPDATE:  The
35870 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
35880 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
35890 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20 64  ly true if the d
358a0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
358b0 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54  e is corrupt.  T
358c0 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  he corruption wi
358d0 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61  ll be detected a
358e0 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65  nd reported late
358f0 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70  r.  ** in this p
35900 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65 72  rocedure so ther
35910 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
35920 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e  act upon it now.
35930 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  .  */.#if 0.  as
35940 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
35950 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
35960 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
35970 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
35980 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28  #endif..  TRACE(
35990 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
359a0 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
359b0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
359c0 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
359d0 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
359e0 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
359f0 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
35a00 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
35a10 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
35a20 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
35a30 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
35a40 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
35a50 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
35a60 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
35a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
35a80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
35a90 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
35aa0 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46  nup;.  }.  pageF
35ab0 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  lags = apOld[0]-
35ac0 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
35ad0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
35ae0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
35af0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
35b00 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
35b10 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
35b20 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
35b30 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
35b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35b50 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
35b60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
35b70 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
35b80 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
35b90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
35bb0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
35bc0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
35bd0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
35be0 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75  New, &pgno, (bBu
35bf0 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20  lk ? 1 : pgno), 
35c00 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
35c10 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
35c20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
35c30 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
35c40 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
35c50 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
35c60 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35c70 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
35c80 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
35c90 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
35ca0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
35cb0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
35cc0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
35cd0 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
35ce0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
35cf0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35d10 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
35d20 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35d40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
35d50 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
35d60 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
35d70 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
35d80 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
35d90 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
35da0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
35db0 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
35dc0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
35dd0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35de0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
35df0 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
35e00 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
35e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
35e20 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
35e30 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
35e40 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
35e50 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
35e60 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
35e70 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
35e80 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
35e90 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
35ea0 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
35eb0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
35ec0 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
35ed0 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
35ee0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
35ef0 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
35f00 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
35f10 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
35f20 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
35f30 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
35f40 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
35f50 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
35f60 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
35f70 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
35f80 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
35f90 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
35fa0 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
35fb0 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
35fc0 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
35fd0 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
35fe0 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
35ff0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
36000 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
36010 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
36020 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
36030 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
36040 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
36050 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
36060 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
36070 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
36080 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
36090 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
360a0 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
360b0 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
360c0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
360d0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
360e0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
360f0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
36100 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
36110 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
36120 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
36130 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
36140 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
36150 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
36160 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
36170 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
36180 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
36190 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
361a0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
361b0 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
361c0 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
361d0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
361e0 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
361f0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
36200 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
36210 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
36220 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
36230 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
36240 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
36250 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
36260 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
36270 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
36280 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
36290 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
362a0 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
362b0 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
362c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
362d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
362e0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
362f0 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
36300 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
36310 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
36320 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
36330 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
36340 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
36350 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
36360 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
36370 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
36380 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
36390 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
363a0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
363b0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
363c0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
363d0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
363e0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
363f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
36400 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
36410 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
36420 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
36430 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
36440 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
36450 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
36460 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
36470 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
36480 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
36490 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
364a0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
364b0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
364c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
364d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
364e0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
364f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
36500 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
36510 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
36520 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
36530 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
36540 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
36550 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
36560 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
36570 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
36580 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
36590 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
365a0 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
365b0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
365c0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
365d0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
365e0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
365f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
36600 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
36610 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
36620 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
36630 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
36640 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
36650 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
36660 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
36670 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
36680 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
36690 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
366a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
366b0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
366c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
366d0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
366e0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
366f0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
36700 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
36710 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
36720 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
36730 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
36740 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
36750 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
36760 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
36770 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
36780 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
36790 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
367a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
367b0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
367c0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
367d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
367e0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
367f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
36800 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
36810 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
36820 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
36830 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
36840 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
36850 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
36860 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
36870 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
36880 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
36890 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
368a0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
368b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
368c0 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
368d0 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
368e0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
368f0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
36900 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
36910 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
36920 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
36930 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
36940 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
36950 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
36960 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
36970 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
36980 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
36990 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
369a0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
369b0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
369c0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
369d0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
369e0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
369f0 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
36a00 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
36a10 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
36a20 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
36a30 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
36a40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
36a50 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
36a60 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
36a70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
36a80 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
36a90 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
36aa0 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
36ab0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
36ac0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
36ad0 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
36ae0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
36af0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
36b00 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
36b10 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
36b20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
36b30 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
36b40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
36b50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
36b60 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
36b70 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
36b80 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
36b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36ba0 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
36bb0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
36bc0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
36bd0 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
36be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
36bf0 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
36c00 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
36c10 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
36c20 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
36c30 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
36c40 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
36c50 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
36c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36c70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
36c80 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
36c90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36ca0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36cb0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
36cc0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
36cd0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
36ce0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
36cf0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
36d00 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
36d10 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
36d20 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
36d30 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
36d40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
36d50 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
36d60 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
36d70 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
36d80 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
36d90 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
36da0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
36db0 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
36dc0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
36dd0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
36de0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
36df0 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
36e00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
36e10 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
36e20 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
36e30 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
36e40 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
36e50 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
36e60 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
36e70 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
36e80 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
36e90 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
36ea0 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
36eb0 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
36ec0 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
36ed0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
36ee0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
36ef0 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
36f00 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
36f10 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
36f20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
36f30 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
36f40 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
36f50 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
36f60 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
36f70 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
36f80 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
36f90 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
36fa0 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
36fb0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
36fc0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
36fd0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
36fe0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
36ff0 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
37000 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
37010 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
37020 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
37030 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
37040 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
37050 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
37060 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
37070 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
37080 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
37090 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
370a0 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
370b0 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
370c0 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
370d0 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
370e0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
370f0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
37100 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
37110 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
37120 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
37130 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
37140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
37150 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
37160 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
37170 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
37180 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
37190 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
371a0 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
371b0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
371c0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
371d0 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
371e0 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
371f0 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
37200 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
37210 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
37220 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
37230 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37240 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
37250 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
37260 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
37270 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
37280 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
37290 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
372a0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
372b0 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
372c0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
372d0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
372e0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
372f0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
37300 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
37310 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
37320 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
37330 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
37340 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
37350 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
37360 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
37370 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
37380 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
37390 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
373a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
373b0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
373c0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
373d0 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
373e0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
373f0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
37400 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
37410 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
37420 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
37430 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
37440 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
37450 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
37460 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
37470 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
37480 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
37490 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
374a0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
374b0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
374c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
374d0 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
374e0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
374f0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
37500 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
37510 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
37520 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
37530 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
37540 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
37550 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
37560 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
37570 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
37580 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
37590 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
375a0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
375b0 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
375c0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
375d0 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
375e0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
375f0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
37600 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
37610 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37620 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
37630 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
37640 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
37650 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
37660 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
37670 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
37680 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
37690 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
376a0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
376b0 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
376c0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
376d0 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
376e0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
376f0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
37700 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
37710 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
37720 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
37730 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
37740 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
37750 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
37760 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
37770 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
37780 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
37790 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
377a0 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
377b0 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
377c0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
377d0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
377e0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
377f0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
37800 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
37810 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
37820 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
37830 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
37840 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
37850 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
37860 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
37870 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
37880 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
37890 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
378a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
378b0 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
378c0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
378d0 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
378e0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
378f0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
37900 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
37910 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
37920 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
37930 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
37940 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
37950 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
37960 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
37970 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
37980 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
37990 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d   pOld->aiOvfl[0]
379a0 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
379b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
379c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
379d0 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
379e0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
379f0 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
37a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a10 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
37a20 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
37a30 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
37a40 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
37a50 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
37a60 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
37a70 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
37a80 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
37a90 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
37aa0 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
37ab0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
37ac0 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
37ad0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
37ae0 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
37af0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
37b00 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
37b10 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
37b20 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
37b30 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
37b40 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
37b50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
37b60 74 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53 69  t( j+1 < ArraySi
37b70 7a 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20 20  ze(apCopy) );.  
37b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b        assert( j+
37b90 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  1 < nOld );.    
37ba0 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70      pOld = apCop
37bb0 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  y[++j];.        
37bc0 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21  iNextOld = i + !
37bd0 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
37be0 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e  >nCell + pOld->n
37bf0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
37c00 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
37c10 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
37c20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70     nOverflow = p
37c30 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
37c40 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
37c50 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  low = i + !leafD
37c60 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76  ata + pOld->aiOv
37c70 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 7d  fl[0];.        }
37c80 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
37c90 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20  er = !leafData; 
37ca0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
37cb0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
37cc0 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77  w>0 || iOverflow
37cd0 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  <i );.      asse
37ce0 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c  rt(nOverflow<2 |
37cf0 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  | pOld->aiOvfl[0
37d00 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  ]==pOld->aiOvfl[
37d10 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  1]-1);.      ass
37d20 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
37d30 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  || pOld->aiOvfl[
37d40 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  1]==pOld->aiOvfl
37d50 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  [2]-1);.      if
37d60 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29  ( i==iOverflow )
37d70 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  {.        isDivi
37d80 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
37d90 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f   if( (--nOverflo
37da0 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w)>0 ){.        
37db0 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20    iOverflow++;. 
37dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37dd0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63  ..      if( i==c
37de0 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20  ntNew[k] ){.    
37df0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
37e00 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
37e10 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
37e20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
37e30 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
37e40 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20  sibling page k. 
37e50 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
37e60 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
37e70 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
37e80 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
37e90 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69  e, then cell i i
37ea0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
37eb0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
37ec0 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b  ew = apNew[++k];
37ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
37ee0 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75  afData ) continu
37ef0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
37f00 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20   assert( j<nOld 
37f10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37f20 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20   k<nNew );..    
37f30 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
37f40 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
37f50 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e  divider cell (an
37f60 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72  d is not now) or
37f70 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65  .      ** an ove
37f80 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69  rflow cell, or i
37f90 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c  f the cell was l
37fa0 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66  ocated on a diff
37fb0 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20  erent sibling.  
37fc0 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f      ** page befo
37fd0 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  re the balancing
37fe0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
37ff0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er map entries a
38000 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
38010 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c  ** with any chil
38020 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
38030 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ges need to be u
38040 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
38050 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20    if( isDivider 
38060 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70  || pOld->pgno!=p
38070 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
38080 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f       if( !leafCo
38090 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
380a0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
380b0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
380c0 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
380d0 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
380e0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
380f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
38100 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  szCell[i]>pNew->
38110 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
38120 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
38130 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  vflPtr(pNew, apC
38140 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  ell[i], &rc);.  
38150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
38160 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
38170 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
38180 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
38190 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
381a0 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d         u32 key =
381b0 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77   get4byte(&apNew
381c0 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  [i]->aData[8]);.
381d0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
381e0 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d  t(pBt, key, PTRM
381f0 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
38200 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  i]->pgno, &rc);.
38210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
38220 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
38230 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
38240 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
38250 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
38260 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
38270 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
38280 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
38290 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
382a0 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
382b0 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
382c0 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
382d0 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
382e0 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
382f0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
38300 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
38310 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
38320 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
38330 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
38340 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
38350 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
38360 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
38370 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
38380 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
38390 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
383a0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
383b0 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
383c0 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
383d0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
383e0 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
383f0 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
38400 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
38410 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
38420 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
38430 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
38440 74 63 68 46 72 65 65 28