/ Hex Artifact Content
Login

Artifact 7b2c3cd16deedff7f4904f2e871e7b77328b9872:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20   aSpace[200];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
5b00: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
5b10: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ld==0 ){.      s
5b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
5b30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
5b40: 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72   pFree);.      r
5b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
5b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
5b80: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
5b90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5ba0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5bb0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
5bc0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
5bd0: 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  );.  if( pFree )
5be0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5bf0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5c00: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5c10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5c30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5c40: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5c50: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5c60: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5c70: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5c80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5c90: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5ca0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5cb0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5cc0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5cd0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5ce0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5cf0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5d00: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5d10: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5d20: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5d30: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
5d40: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5d50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5d70: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5d80: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5d90: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5da0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5db0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5dc0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5dd0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5de0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5df0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
5e00: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5e10: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
5e20: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
5e30: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
5e40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5e50: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
5e60: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
5e70: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
5e80: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70  Cur->nKey, 0, &p
5e90: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a  Cur->skipNext);.
5ea0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5eb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5ec0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5ed0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5ee0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5ef0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5f00: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5f10: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
5f20: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
5f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
5f40: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
5f50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5f60: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5f70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f80: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
5f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
5fb0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
5fc0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
5fd0: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
5ff0: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
6000: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6010: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
6020: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
6030: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
6040: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
6050: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
6060: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
6070: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
6080: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
6090: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
60a0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
60b0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
60c0: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
60d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
60e0: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
60f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6100: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
6110: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6120: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
6130: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
6140: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
6150: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
6160: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
6170: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
6180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6190: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
61a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
61b0: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
61c0: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
61d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
61e0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
61f0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
6200: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
6210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6220: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6230: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
6240: 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b  | NEVER(pCur->sk
6250: 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20  ipNext!=0) ){.  
6260: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
6270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6280: 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  pHasMoved = 0;. 
6290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
62a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
62b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
62c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
62d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
62e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
62f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
6300: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
6310: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
6320: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
6330: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
6340: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
6350: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
6360: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
6370: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
6380: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
6390: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
63a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
63b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
63c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
63d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
63e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
63f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
6400: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
6410: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
6420: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
6430: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6440: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
6450: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6460: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
6470: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
6480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
64a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
64b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
64c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
64d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
64e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
64f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
6500: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
6510: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
6520: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
6530: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
6540: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
6550: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
6560: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
6570: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
6580: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
6590: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
65a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
65b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
65f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
6600: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
6610: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6620: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
6630: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
6640: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
6650: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6660: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6670: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6680: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6690: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
66a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
66b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
66c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
66d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
66e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
66f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6700: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
6710: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
6720: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6730: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
6740: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6750: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6760: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6770: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6780: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6790: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
67a0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
67b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
67c0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
67d0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
67e0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
67f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
6800: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
6810: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
6820: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
6830: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
6840: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6850: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6860: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6870: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6880: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6890: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
68a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
68b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
68c0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
68d0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
68e0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
68f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
6900: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
6910: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
6920: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6930: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6940: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6950: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6960: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6970: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6980: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6990: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
69a0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
69b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
69c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
69d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
69e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
69f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
6a00: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
6a10: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
6a20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6a40: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
6a50: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
6a60: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
6a70: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
6a80: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
6a90: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
6aa0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
6ab0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
6ac0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
6ad0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
6ae0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6af0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
6b00: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
6b10: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
6b20: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
6b30: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
6b40: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
6b50: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6b60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
6b70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b80: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
6b90: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
6ba0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
6bb0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6bc0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
6bd0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
6be0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
6bf0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6c00: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
6c10: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
6c20: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6c40: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6c50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6c60: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6c70: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6c80: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6c90: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6ca0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6cb0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6cc0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
6cd0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6ce0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6cf0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
6d00: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
6d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
6d20: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6d30: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6d40: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6d50: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6d60: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6d70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6d80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6d90: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6da0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6db0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6dc0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6dd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6de0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
6df0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
6e00: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
6e10: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
6e20: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6e30: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6e60: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6e70: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6e80: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6e90: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6ea0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6eb0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6ec0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
6ed0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6ee0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6ef0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6f00: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
6f10: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6f20: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6f30: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6f40: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6f50: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6f60: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
6f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6f80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6f90: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6fa0: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
6fb0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
6fc0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6fd0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6fe0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6ff0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
7000: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
7010: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7020: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
7030: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7040: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
7050: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
7060: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
7070: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7090: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
70a0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
70b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
70c0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
70d0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
70e0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
70f0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
7100: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
7110: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
7120: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
7130: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7140: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
7150: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
7160: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
7170: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
7180: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
7190: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
71a0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
71b0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
71c0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
71d0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
71e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
71f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
7200: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
7210: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7220: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7230: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7240: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7250: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7260: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7270: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7280: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7290: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
72a0: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
72b0: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
72c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
72d0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
72e0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
72f0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
7300: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
7310: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
7320: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7330: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7340: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7350: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7360: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7380: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7390: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
73a0: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
73b0: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
73c0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
73d0: 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67   k;.    k = pPag
73e0: 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->aiOvfl[i];.  
73f0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
7400: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
7410: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
7420: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70  return pPage->ap
7430: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  Ovfl[i];.      }
7440: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
7450: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7460: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
7470: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
7480: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
7490: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
74a0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
74b0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
74c0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
74d0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
74e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
74f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7500: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
7510: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
7520: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7530: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
7540: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
7550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7560: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
7570: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
7580: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7590: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
75a0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
75b0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
75c0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
75d0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
75e0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
75f0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
7600: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
7610: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
7620: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7630: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7640: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7650: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7660: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7670: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7690: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
76a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
76b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
76c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
76d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
76e0: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
7710: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
7720: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7730: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
7740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7750: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
7760: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
7770: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7780: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7790: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
77a0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
77b0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
77c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
77d0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
77e0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
77f0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
7800: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
7810: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
7820: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7830: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
7840: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
7860: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
7870: 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
7880: 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  l, nPayload);.  
7890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
78a0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
78b0: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
78c0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
78d0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
78e0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
78f0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
7900: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
7910: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7920: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7930: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7940: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7950: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7960: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7970: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7980: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7990: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
79a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
79b0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
79c0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
79d0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
79e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
79f0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
7a00: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
7a10: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7a20: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7a30: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7a40: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7a50: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7a60: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7a70: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7a80: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7a90: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7aa0: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
7ab0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
7ac0: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
7ad0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
7ae0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7af0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
7b00: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
7b10: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
7b30: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
7b40: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
7b50: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7b60: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7b70: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7b80: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7b90: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7ba0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7bb0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7bc0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7bd0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7be0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7bf0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7c00: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7c10: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7c20: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
7c30: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
7c40: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
7c50: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7c60: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7c70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7c80: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7c90: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7ca0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7cb0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7cc0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7cd0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7ce0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7cf0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7d00: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7d10: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7d20: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d30: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d40: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
7d50: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7d60: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d70: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d80: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7d90: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7da0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7db0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7dc0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7dd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7de0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7df0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7e00: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7e10: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7e20: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7e30: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7e40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7e50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7e60: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7e70: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7e80: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7e90: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7ea0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7eb0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7ec0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7ed0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7ef0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7f00: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7f10: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7f20: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7f30: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7f40: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7f50: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7f60: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7f70: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7f80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7f90: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7fa0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fb0: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7fc0: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7fd0: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7ff0: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8010: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8020: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8030: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8050: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
8060: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
8070: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8080: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8090: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
80a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
80b0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
80c0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
80d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
80e0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
80f0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8100: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8110: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8120: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8130: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8140: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8150: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8160: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8170: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8180: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8190: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
81a0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
81b0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
81c0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
81d0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
81e0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
81f0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8200: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
8210: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
8220: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
8230: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
8240: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
8250: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8260: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8270: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
8280: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
8290: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
82a0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
82b0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
82c0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
82d0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
82e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
82f0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
8300: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
8310: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
8320: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
8330: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
8340: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
8350: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
8360: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8370: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8380: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8390: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
83a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
83b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
83c0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
83d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
83e0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
83f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8400: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8410: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8420: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
8430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
8440: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8450: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8460: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8470: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8480: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
84a0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
84b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
84c0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
84d0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
84e0: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
84f0: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8500: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8510: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8520: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8530: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
8540: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8550: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8560: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8570: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8580: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8590: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
85a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
85b0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
85c0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
85d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
85e0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
85f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8600: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
8610: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
8620: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
8630: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8640: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
8650: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8660: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8670: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8680: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8690: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
86a0: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
86b0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
86c0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
86d0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
86e0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
86f0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8700: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8710: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8720: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
8730: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
8740: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8750: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
8760: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8770: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8780: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8790: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
87a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
87b0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
87c0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
87d0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
87e0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
87f0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8800: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8810: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8820: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8830: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
8840: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
8850: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
8860: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8870: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8890: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
88a0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
88b0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
88c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
88d0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
88e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
88f0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8900: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8910: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8920: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
8930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
8940: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
8950: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8960: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8970: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8980: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8990: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
89a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
89b0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
89c0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
89d0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
89e0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
89f0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8a00: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8a10: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8a20: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
8a30: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
8a40: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
8a50: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
8a60: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8a70: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8a80: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8a90: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8aa0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8ab0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8ac0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8ad0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8ae0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8af0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8b00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8b10: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8b20: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
8b30: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
8b40: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
8b50: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8b60: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8b70: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8b80: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8b90: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8ba0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8bb0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8bc0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8bd0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8be0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8bf0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8c00: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8c10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8c20: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
8c30: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8c60: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8c70: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8ca0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8cb0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8cc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8cd0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8ce0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8cf0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8d00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8d20: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
8d30: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
8d40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8d50: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8d60: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8d70: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8d90: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8da0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8db0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8dc0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8dd0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8de0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8df0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8e00: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8e10: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8e20: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8e40: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8e50: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8e60: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8e70: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8e80: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8e90: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8ea0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8eb0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8ec0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8ed0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8ee0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8ef0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8f00: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8f10: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8f30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8f70: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8f80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8f90: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8fa0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8fb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8fc0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8fd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8fe0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8ff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
9000: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
9010: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9020: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9030: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9040: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9050: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9060: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
9070: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9080: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
9090: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
90a0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
90b0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
90c0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
90d0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
90e0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
90f0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
9100: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
9110: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
9120: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
9130: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
9140: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
9150: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
9160: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
9170: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
9180: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
9190: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
91c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91d0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
91e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
91f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9200: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9210: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9220: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9230: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9240: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9250: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9260: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9270: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9280: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9290: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
92a0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
92b0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
92c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
92d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
92f0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
9300: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9310: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9320: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9330: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9340: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9350: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9360: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9370: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9380: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9390: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
93a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
93b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
93c0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
93d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
93e0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
93f0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9410: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9420: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9430: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9440: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9450: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9460: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9470: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9480: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
94a0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
94b0: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
94c0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
94d0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
94e0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
94f0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9500: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9510: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9520: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9530: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9540: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9550: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9560: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9570: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9580: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9590: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
95a0: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
95b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
95c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
95d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
95e0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
95f0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9610: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9630: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9640: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9650: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9660: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9670: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9680: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9690: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
96a0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
96b0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
96c0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
96d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
96e0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
96f0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9700: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9710: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9720: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
9730: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
9740: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
9750: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
9760: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9770: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9780: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
97a0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
97b0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
97c0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
97d0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
97e0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
97f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9800: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9810: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9820: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
9830: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
9840: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
9850: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
9860: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9870: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9880: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9890: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
98a0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
98b0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
98c0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
98d0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
98e0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
98f0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9900: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9910: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9920: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
9930: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
9940: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
9950: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
9960: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9970: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9980: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9990: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
99a0: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99d0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
99e0: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
99f0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9a20: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
9a30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9a40: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
9a50: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9a60: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9a70: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9a80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9a90: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9aa0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9ab0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9ac0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9ad0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9ae0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9af0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9b00: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9b10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9b20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9b30: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9b40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9b50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9b60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9b70: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9b80: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9b90: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9ba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9bb0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9bd0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9be0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9bf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9c00: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
9c10: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
9c20: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
9c30: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9c40: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
9c50: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9c60: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9c70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9c80: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9c90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9ca0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9cb0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9cc0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9cd0: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9ce0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9cf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9d00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9d10: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
9d20: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
9d30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9d40: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
9d50: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
9d60: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9d70: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9d80: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9d90: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9da0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9db0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9dc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9dd0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9de0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9df0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9e00: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9e10: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9e20: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9e30: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9e40: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9e50: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9e60: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9e70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9e80: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9e90: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9ea0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9eb0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9ec0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ough to accommod
9ed0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
9ee0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
9ef0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
9f00: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
9f10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9f20: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9f30: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20       int size;  
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9f50: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
9f60: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9f70: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
9f80: 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a  || pc<addr+4 ){.
9f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9fa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9fb0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
9fc0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
9fd0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
9fe0: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
9ff0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a000: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a010: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74  nByte;.        t
a020: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a030: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a040: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
a050: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
a060: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
a070: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
a080: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
a090: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
a0a0: 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
a0b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a0c0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a0d0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
a0e0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
a0f0: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
a100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
a110: 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28  a[hdr+7] = (u8)(
a120: 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20  nFrag + x);.    
a130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69      }else if( si
a140: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
a150: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
a160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a170: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a190: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
a1a0: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
a1b0: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
a1c0: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
a1d0: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20  count.          
a1e0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
a1f0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
a200: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
a210: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  /.          put2
a220: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a230: 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , x);.        }.
a240: 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20          *pIdx = 
a250: 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20  pc + x;.        
a260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a280: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
a290: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a2a0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
a2b0: 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f  ce in the gap to
a2c0: 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68   satisfy.  ** th
a2d0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49  e allocation.  I
a2e0: 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e  f not, defragmen
a2f0: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
a300: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
a310: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
a320: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
a330: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
a340: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
a350: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a360: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
a370: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
a380: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
a390: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
a3a0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
a3b0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
a3c0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
a3d0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
a3e0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
a3f0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
a400: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
a410: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
a420: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
a430: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
a440: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
a450: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
a460: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
a470: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
a480: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
a490: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
a4a0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
a4b0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
a4c0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
a4d0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
a4e0: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
a4f0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
a500: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
a510: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
a520: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a530: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
a540: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
a550: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
a560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a570: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
a580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a5a0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
a5b0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
a5c0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
a5d0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
a5e0: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
a5f0: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
a600: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
a610: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
a620: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
a630: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
a640: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
a650: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
a660: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
a670: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
a680: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
a690: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
a6a0: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
a6b0: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
a6c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
a6d0: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
a6e0: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
a6f0: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
a700: 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20  ;.  int iLast;  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
a730: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
a740: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
a750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
a760: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
a770: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
a780: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
a790: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a7a0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
a7b0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
a7c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a7d0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
a7e0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
a7f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
a800: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
a810: 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74   + size) <= (int
a820: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
a830: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a840: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a850: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a860: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a870: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a880: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a890: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a8a0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a8b0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
a8c0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
a8d0: 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  E ){.    /* Over
a8e0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a8f0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a900: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a910: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a920: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a930: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a940: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a950: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a960: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a970: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a980: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a990: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a9a0: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a9b0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a9c0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a9d0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a9e0: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a9f0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
aa00: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
aa10: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
aa20: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
aa30: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
aa40: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
aa50: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
aa60: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
aa70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
aa80: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
aa90: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
aaa0: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
aab0: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
aac0: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
aad0: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
aae0: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
aaf0: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
ab00: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
ab10: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
ab20: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
ab30: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
ab40: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
ab50: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
ab60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ab70: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
ab80: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
ab90: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
aba0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
abb0: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
abc0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
abd0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
abe0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
abf0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
ac00: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
ac10: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
ac20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ac30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ac40: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
ac50: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
ac60: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
ac70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ac90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
aca0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
acb0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
acc0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
acd0: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
ace0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
acf0: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
ad00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
ad10: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
ad20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
ad30: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
ad40: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
ad50: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
ad60: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
ad70: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
ad80: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
ad90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
ada0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
adb0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
adc0: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
add0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
ade0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
adf0: 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74  ( pbegin <= (int
ae00: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ae10: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
ae20: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
ae30: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
ae40: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
ae50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ae60: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
ae70: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
ae80: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
ae90: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
aea0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
aeb0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
aec0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  e);.      if( (f
aed0: 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e  rag<0) || (frag>
aee0: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
aef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
af00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
af20: 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b  .      data[hdr+
af30: 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a  7] -= (u8)frag;.
af40: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
af50: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
af60: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
af70: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
af80: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e  x);.      x = pn
af90: 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26  ext + get2byte(&
afa0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d  data[pnext+2]) -
afb0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70   pbegin;.      p
afc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
afd0: 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  egin+2], x);.   
afe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
aff0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
b000: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
b010: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b020: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
b030: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
b040: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
b050: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
b060: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
b070: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
b080: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
b090: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
b0a0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b0b0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
b0c0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
b0d0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
b0e0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
b0f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b100: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
b110: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b120: 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  n+2]);.    put2b
b130: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b140: 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73  , top);.  }.  as
b150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b160: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
b1a0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
b1b0: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
b1c0: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
b1d0: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
b1e0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
b1f0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
b200: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
b210: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
b220: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
b230: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
b240: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
b250: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
b260: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
b270: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
b280: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
b290: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
b2a0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
b2b0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
b2c0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
b2d0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
b2e0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
b2f0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
b300: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
b310: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
b320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
b330: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
b340: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
b350: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
b360: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
b370: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
b380: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
b390: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
b3a0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
b3b0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
b3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b3d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b3e0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b3f0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
b400: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
b410: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
b420: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
b430: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
b440: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
b450: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
b460: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
b470: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
b480: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
b490: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
b4a0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
b4b0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
b4c0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b4d0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
b4e0: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
b4f0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b500: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b510: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
b520: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
b530: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
b540: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
b550: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b570: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
b580: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
b590: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
b5a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
b5b0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
b5c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b5d0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
b5e0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
b5f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b600: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
b610: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b620: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
b630: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
b640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b650: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
b660: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
b670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
b680: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
b690: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
b6a0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
b6b0: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
b6c0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
b6d0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
b6e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
b6f0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
b700: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
b710: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
b720: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
b730: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
b740: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
b750: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b760: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
b770: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
b780: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
b790: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
b7a0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
b7b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
b7c0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
b7d0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
b7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b800: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b810: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b820: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b830: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
b840: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
b850: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
b860: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b870: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
b880: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
b890: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b8b0: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
b8c0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
b8d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b8e0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
b8f0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
b900: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
b910: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b920: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
b930: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
b940: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
b950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
b960: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b970: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b980: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
b990: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
b9a0: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
b9b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
b9c0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b9d0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
b9e0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
b9f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
ba00: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
ba10: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
ba20: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
ba30: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
ba40: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
ba50: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
ba60: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
ba70: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
ba80: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
baa0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
bab0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
bac0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
bad0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bae0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
baf0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
bb00: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
bb10: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
bb20: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
bb30: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
bb40: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
bb50: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
bb60: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
bb70: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
bb80: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
bb90: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
bba0: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
bbb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bbc0: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
bbd0: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
bbe0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
bbf0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
bc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bc10: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bc20: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
bc30: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bc40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
bc50: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
bc60: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
bc70: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
bc80: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
bc90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
bca0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
bcb0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
bcc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
bcd0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
bce0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
bcf0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bd00: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
bd10: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
bd20: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
bd30: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
bd40: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bd50: 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  t];.    top = ge
bd60: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
bd70: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
bd80: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
bd90: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bda0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
bdb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
bdc0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
bdd0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
bde0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
bdf0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
be00: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
be10: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
be20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be30: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
be40: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
be50: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
be60: 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  pBt) );..    /* 
be70: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
be80: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
be90: 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
bea0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
beb0: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
bec0: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
bed0: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
bee0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
bef0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
bf00: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
bf10: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
bf20: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
bf30: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
bf40: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
bf50: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
bf60: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
bf70: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
bf80: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
bf90: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
bfa0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
bfb0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
bfc0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
bfd0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66  bleSize - 4;.#if
bfe0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bff0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
c000: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
c010: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c030: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
c040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
c050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
c060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c070: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
c080: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
c090: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
c0a0: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
c0b0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
c0c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
c0d0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c0e0: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
c0f0: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
c100: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c110: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
c120: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c130: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
c140: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
c150: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c160: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c180: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c190: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
c1a0: 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
c1b0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
c1c0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
c1d0: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
c1e0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c1f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
c200: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
c210: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c220: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c230: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
c240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c250: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
c260: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
c270: 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20    }  .#endif..  
c280: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c290: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
c2a0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
c2b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c2c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
c2d0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
c2e0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
c2f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30  .    while( pc>0
c300: 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65   ){.      u16 ne
c310: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  xt, size;.      
c320: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c330: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c340: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c350: 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c  Start of free bl
c360: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
c370: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
c380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c390: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c3a0: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
c3b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c3c0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
c3d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c3e0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
c3f0: 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
c400: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
c410: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c420: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c430: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
c440: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
c450: 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
c460: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
c470: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c480: 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
c490: 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
c4a0: 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
c4b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c4c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c4d0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
c4e0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
c4f0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
c500: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
c510: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
c520: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
c530: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
c540: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c550: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
c560: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c570: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
c580: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
c590: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
c5a0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
c5b0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
c5c0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
c5d0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
c5e0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
c5f0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
c600: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
c610: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
c620: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
c630: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
c640: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
c650: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
c660: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
c670: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
c680: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
c690: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
c6a0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
c6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6c0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
c6d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6f0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c700: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c710: 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
c720: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
c730: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
c750: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c760: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
c770: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
c780: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
c790: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
c7a0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
c7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c7c0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
c7d0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
c7e0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
c7f0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
c800: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
c810: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
c820: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
c830: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c840: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
c850: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
c860: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
c870: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
c880: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
c890: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
c8a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c8b0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
c8c0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
c8d0: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
c8e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
c8f0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
c900: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
c910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c920: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c930: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c940: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c960: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c970: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
c980: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
c990: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
c9a0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c9b0: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
c9c0: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
c9d0: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
c9e0: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
c9f0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
ca00: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
ca10: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
ca20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
ca30: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
ca40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
ca50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
ca60: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
ca70: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
ca80: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
ca90: 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
caa0: 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64  ze - first);.  d
cab0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
cac0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
cad0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
cae0: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
caf0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
cb00: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
cb10: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
cb20: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
cb30: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
cb40: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
cb50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cb60: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
cb70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
cb80: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
cb90: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
cba0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
cbb0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
cbc0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
cbd0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
cbe0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
cbf0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
cc00: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
cc10: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
cc20: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
cc30: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
cc40: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
cc50: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
cc60: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
cc70: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
cc80: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
cc90: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
cca0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
ccb0: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
ccc0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
ccd0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
cce0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
ccf0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
cd00: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
cd10: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
cd20: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
cd30: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
cd40: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
cd50: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
cd60: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
cd70: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
cd80: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
cd90: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
cda0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
cdb0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
cdc0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
cdd0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
cde0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
cdf0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ce00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
ce10: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
ce20: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
ce30: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
ce40: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
ce50: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
ce60: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
ce70: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
ce80: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
ce90: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
cea0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
ceb0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
cec0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
ced0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
cee0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
cef0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
cf00: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
cf10: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
cf20: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
cf30: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
cf40: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
cf50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
cf60: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
cf70: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
cf80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
cf90: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
cfa0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
cfb0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
cfc0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
cfd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cfe0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
cff0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
d000: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d010: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
d020: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
d030: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
d040: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
d050: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
d060: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
d070: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
d080: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
d090: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
d0a0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
d0b0: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
d0c0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d0d0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
d0e0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d100: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d110: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
d120: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d130: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
d140: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
d150: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
d160: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
d170: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
d180: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
d190: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
d1a0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
d1b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d1c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d1d0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
d1e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
d1f0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
d200: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
d210: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
d220: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
d230: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
d240: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d250: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d260: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d270: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d280: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
d290: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
d2a0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
d2b0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
d2c0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
d2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d2e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d2f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d300: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
d310: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
d320: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
d330: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
d340: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
d350: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d360: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
d370: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
d380: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
d390: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
d3a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d3b0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
d3c0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
d3d0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
d3e0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
d3f0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
d400: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
d410: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
d420: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
d430: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
d440: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
d450: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
d460: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
d470: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d480: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
d490: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
d4a0: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
d4b0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
d4c0: 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f  (int)btreePageco
d4d0: 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
d4e0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
d4f0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d500: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
d510: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
d520: 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f   is just a.** co
d530: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
d540: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
d550: 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  e calls to btree
d560: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a  GetPage() and .*
d570: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
d580: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
d590: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
d5a0: 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50  n the value *ppP
d5b0: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73  age is set to is
d5c0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
d5d0: 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
d5e0: 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
d5f0: 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
d600: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
d610: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
d620: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
d630: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d650: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
d660: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
d670: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
d680: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d690: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
d6a0: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
d6b0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
d6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d6d0: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
d6e0: 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ter here */.  in
d6f0: 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20 20  t bReadonly     
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d710: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
d720: 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  NLY or 0 */.){. 
d730: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
d740: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d750: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d760: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  ) );.  assert( b
d770: 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f  Readonly==PAGER_
d780: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20  GET_READONLY || 
d790: 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a  bReadonly==0 );.
d7a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d7b0: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d7c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d7d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d7e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d7f0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d800: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d810: 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20  e, bReadonly);. 
d820: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d830: 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65  E_OK && (*ppPage
d840: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
d850: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d860: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d870: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d890: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d8a0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d8b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d8c0: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d8d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d8e0: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d8f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d900: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d910: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d920: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d930: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d940: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d950: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d960: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d980: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d990: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d9a0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d9b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d9c0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d9d0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d9e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d9f0: 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
da00: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
da10: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
da20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
da30: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
da40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
da50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
da60: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
da70: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
da80: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
da90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
daa0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
dab0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
dac0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
dad0: 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
dae0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
daf0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
db00: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
db10: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
db20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
db30: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
db40: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
db50: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
db60: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
db70: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
db80: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
db90: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
dba0: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
dbb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
dbc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
dbd0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
dbe0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
dbf0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
dc00: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
dc10: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
dc20: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
dc30: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
dc40: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
dc50: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
dc60: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
dc70: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
dc80: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
dc90: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
dca0: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
dcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
dcc0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
dcd0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
dce0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
dcf0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dd00: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
dd10: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
dd20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
dd30: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
dd40: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
dd50: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
dd60: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
dd70: 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
dd80: 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
dd90: 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
dda0: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
ddb0: 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
ddc0: 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
ddd0: 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
dde0: 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
ddf0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
de00: 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
de10: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
de30: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
de40: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
de50: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
de60: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
de70: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
de80: 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
de90: 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
dea0: 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
deb0: 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
dec0: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
ded0: 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
dee0: 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
def0: 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
df00: 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
df10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
df20: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
df30: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
df40: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
df50: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
df60: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
df70: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
df80: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
df90: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
dfa0: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
dfb0: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
dfc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
dfd0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
dfe0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
dff0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
e000: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
e010: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
e020: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
e030: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
e040: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
e050: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
e060: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
e070: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
e080: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
e090: 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
e0a0: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
e0b0: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
e0c0: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
e0d0: 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
e0e0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
e0f0: 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
e100: 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
e110: 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
e120: 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
e130: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
e140: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
e150: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
e160: 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
e170: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
e180: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
e190: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
e1a0: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
e1b0: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
e1c0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
e1d0: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
e1e0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
e1f0: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
e200: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
e210: 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
e220: 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
e230: 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
e240: 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
e250: 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
e260: 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
e270: 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
e280: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
e290: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
e2a0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
e2b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e2c0: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
e2d0: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
e2e0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
e2f0: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
e300: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
e310: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
e320: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
e330: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
e340: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
e350: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
e360: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e370: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
e380: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
e390: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
e3a0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
e3b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
e3c0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
e3d0: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
e3e0: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
e3f0: 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
e400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
e410: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
e420: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
e430: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
e440: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
e450: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
e460: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
e470: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
e480: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
e490: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
e4a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e4b0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
e4c0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
e4d0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
e4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
e4f0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
e500: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
e510: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
e520: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
e530: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
e540: 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
e550: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
e560: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
e570: 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
e580: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
e590: 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5b0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
e5c0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
e5d0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
e5e0: 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
e5f0: 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
e600: 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
e610: 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
e620: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e630: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
e640: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
e650: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
e660: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e680: 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
e690: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
e6a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
e6b0: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
e6c0: 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
e6d0: 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
e6e0: 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
e6f0: 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
e700: 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
e710: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
e720: 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
e730: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
e740: 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
e750: 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
e760: 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
e770: 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
e780: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e790: 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
e7a0: 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
e7b0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
e7c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
e7d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e7e0: 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
e7f0: 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
e800: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
e810: 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
e820: 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
e830: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
e840: 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
e860: 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
e870: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
e880: 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
e8a0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
e8b0: 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
e8c0: 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
e8d0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
e8e0: 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
e8f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e900: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e910: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
e920: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e930: 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
e940: 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
e950: 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
e960: 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
e970: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
e980: 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
e990: 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
e9a0: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
e9b0: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
e9c0: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
e9d0: 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
e9e0: 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
e9f0: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
ea00: 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
ea10: 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
ea20: 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
ea30: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
ea40: 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
ea50: 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
ea60: 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
ea70: 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
ea80: 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
ea90: 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
eaa0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
eab0: 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
eac0: 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
ead0: 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
eae0: 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
eaf0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
eb00: 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
eb10: 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
eb20: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
eb30: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
eb40: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
eb50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
eb60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
eb70: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
eb80: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
eb90: 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
eba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
ebb0: 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
ebc0: 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
ebd0: 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
ebe0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
ebf0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ec00: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ec10: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
ec20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
ec30: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
ec40: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
ec50: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
ec60: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
ec70: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
ec80: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
ec90: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
eca0: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
ecb0: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
ecc0: 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
ecd0: 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
ece0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
ecf0: 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
ed00: 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
ed10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
ed20: 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
ed30: 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
ed40: 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
ed50: 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
ed60: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
ed70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
ed80: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
ed90: 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  );.      MUTEX_L
eda0: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
edb0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
edc0: 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ; ).      p->sha
edd0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
ede0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
edf0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
ee00: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ee10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ee20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ee30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
ee40: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
ee50: 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
ee60: 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
ee70: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
ee80: 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 29  30(zFilename)+1)
ee90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eea0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
eeb0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
eec0: 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
eed0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
ef00: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
ef10: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
ef20: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
ef30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
ef40: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ef50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ef60: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
ef70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ef80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ef90: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
efa0: 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
efb0: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
efc0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
efd0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
efe0: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
eff0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f000: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
f010: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
f020: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f030: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f040: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f050: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f060: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
f070: 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
f080: 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
f090: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
f0a0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
f0b0: 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
f0c0: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
f0d0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
f0e0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
f0f0: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
f100: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
f110: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
f120: 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
f130: 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
f140: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
f150: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
f160: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
f170: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
f180: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
f190: 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
f1a0: 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
f1b0: 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
f1c0: 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
f1d0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
f1f0: 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
f200: 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
f210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f220: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f230: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
f240: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
f250: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f260: 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
f270: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f280: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
f290: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f2a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f2b0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
f2c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f2d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
f2e0: 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
f2f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
f300: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
f310: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
f320: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
f330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f360: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f370: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
f380: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
f390: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
f3a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
f3b0: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
f3c0: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
f3d0: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
f3e0: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
f3f0: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
f400: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
f410: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
f420: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
f430: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
f440: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
f450: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
f460: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
f470: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
f480: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
f490: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
f4a0: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
f4b0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
f4c0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
f4d0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
f4e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
f4f0: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
f500: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
f510: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
f520: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
f530: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
f540: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
f550: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
f560: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
f570: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
f580: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
f590: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
f5a0: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
f5b0: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
f5c0: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
f5d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
f5e0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
f5f0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
f600: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
f610: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
f620: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
f630: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
f640: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
f650: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
f660: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
f670: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
f680: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
f690: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
f6a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
f6b0: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
f6c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
f6d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
f6e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f6f0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f700: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f710: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f720: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
f730: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
f740: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
f770: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
f780: 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
f790: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f7a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
f7b0: 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
f7c0: 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
f7d0: 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
f7e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f7f0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
f800: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
f810: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
f820: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
f830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f840: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f850: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f860: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f870: 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
f880: 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
f890: 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
f8a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
f8b0: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
f8c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
f8d0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f8e0: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
f8f0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f900: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
f910: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
f920: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
f930: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
f940: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
f950: 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
f960: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
f970: 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66  EAD_ONLY;.#ifdef
f980: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
f990: 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62  ELETE.    pBt->b
f9a0: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
f9b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65  ECURE_DELETE;.#e
f9c0: 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61  ndif.    pBt->pa
f9d0: 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
f9e0: 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
f9f0: 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
fa00: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
fa10: 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
fa20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
fa30: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
fa40: 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
fa50: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
fa60: 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
fa70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
fa80: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
fa90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
faa0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
fab0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
fac0: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
fad0: 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
fae0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
faf0: 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
fb00: 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
fb10: 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
fb20: 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
fb30: 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
fb40: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
fb50: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
fb60: 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
fb70: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
fb80: 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
fb90: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
fba0: 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
fbb0: 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
fbc0: 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
fbd0: 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
fbe0: 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
fbf0: 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
fc00: 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
fc10: 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
fc20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
fc30: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
fc40: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
fc50: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
fc60: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
fc70: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
fc80: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
fc90: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
fca0: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
fcb0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
fcc0: 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
fcd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
fce0: 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
fcf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd00: 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
fd10: 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
fd20: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
fd30: 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
fd40: 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
fd50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
fd60: 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
fd70: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
fd80: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
fd90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
fda0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
fdb0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
fdc0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
fdd0: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
fde0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
fdf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fe00: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
fe10: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
fe20: 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
fe30: 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
fe40: 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
fe50: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
fe60: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
fe70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
fe80: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
fe90: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
fea0: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
feb0: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
fec0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
fed0: 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
fee0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
fef0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
ff00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ff10: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
ff20: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
ff30: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
ff40: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
ff50: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
ff60: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
ff70: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
ff80: 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
ff90: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
ffa0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
ffb0: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d  ed; ).      pBt-
ffc0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
ffd0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
ffe0: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
fff0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10000 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
10010 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
10020 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
10030 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
10040 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
10050 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
10060 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
10070 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10080 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10090 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
100a0 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
100b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
100c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
100d0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
100e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
100f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10100 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
10110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10120 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
10130 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
10140 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
10150 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
10160 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10170 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10180 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
10190 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
101a0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
101b0 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
101c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
101d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
101e0 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
101f0 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
10200 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10210 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10220 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10230 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10240 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
10250 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
10260 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
10270 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
10280 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
10290 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
102a0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
102b0 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
102c0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
102d0 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
102e0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
102f0 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
10300 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
10310 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
10320 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
10330 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
10340 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
10350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
10360 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
10370 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
10380 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
10390 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
103a0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
103b0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
103c0 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
103d0 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
103e0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
103f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
10400 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
10410 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
10420 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
10430 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
10440 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
10450 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
10460 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
10470 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
10480 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
10490 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
104a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104b0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
104c0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
104d0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
104e0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
104f0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
10500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
10510 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
10520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10530 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
10540 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
10550 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
10560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
10580 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
10590 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
105a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
105b0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
105c0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
105d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
105e0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
105f0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
10600 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10610 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
10620 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
10630 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
10640 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
10650 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
10660 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
10670 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
10680 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
10690 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
106a0 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
106b0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
106c0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
106d0 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
106e0 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
106f0 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
10700 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
10710 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
10720 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
10730 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
10740 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
10750 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
10760 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
10770 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
10780 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SIZE);.    }.  }
10790 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
107a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
107b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
107c0 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
107d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
107e0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
107f0 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
10800 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
10810 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
10820 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
10830 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
10840 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
10850 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
10860 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
10870 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
10880 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
10890 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
108a0 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
108b0 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
108c0 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
108d0 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
108e0 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
108f0 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
10900 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
10910 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
10920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10930 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
10940 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10950 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
10960 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72  ster; ).  BtShar
10970 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
10980 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
10990 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
109a0 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
109b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
109c0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
109d0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
109e0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
109f0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10a00 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
10a10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
10a20 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
10a30 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
10a40 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
10a50 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
10a60 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10a70 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
10a80 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
10a90 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10aa0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10ab0 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
10ac0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
10ad0 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
10ae0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10af0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10b00 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
10b10 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
10b20 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
10b30 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
10b40 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
10b50 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
10b60 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
10b70 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
10b80 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
10b90 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
10ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10bb0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
10bc0 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
10bd0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
10be0 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
10bf0 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
10c00 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
10c10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
10c20 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
10c30 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
10c40 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
10c50 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
10c60 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
10c70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
10c80 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
10c90 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
10ca0 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
10cb0 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
10cc0 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
10cd0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
10ce0 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
10cf0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
10d00 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
10d10 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
10d20 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
10d30 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
10d40 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
10d50 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
10d60 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
10d70 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
10d80 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
10d90 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
10da0 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
10db0 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
10dc0 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
10dd0 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
10de0 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
10df0 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
10e00 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
10e10 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
10e20 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
10e30 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
10e40 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
10e50 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
10e60 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
10e70 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
10e80 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
10e90 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
10ea0 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
10eb0 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
10ec0 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
10ed0 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
10ee0 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
10ef0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
10f00 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
10f10 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
10f20 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
10f30 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
10f40 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
10f50 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
10f60 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
10f70 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
10f80 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
10f90 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
10fa0 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
10fb0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
10fc0 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
10fd0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  e.  */.    if( p
10fe0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 20  Bt->pTmpSpace ) 
10ff0 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
11000 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a 20 20  Space, 0, 4);.  
11010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
11020 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
11030 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
11040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
11050 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
11060 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
11070 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42  ite3PageFree( pB
11080 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
11090 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
110a0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  = 0;.}../*.** Cl
110b0 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
110c0 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
110d0 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
110e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
110f0 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
11100 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11110 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11120 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
11130 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
11140 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
11150 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
11160 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
11170 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11180 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11190 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
111a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
111b0 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
111c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
111d0 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
111e0 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
111f0 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
11200 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
11210 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
11220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
11230 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
11240 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
11250 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
11260 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
11270 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
11280 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
11290 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
112a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
112b0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
112c0 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
112d0 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
112e0 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
112f0 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
11300 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
11310 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
11320 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11330 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
11340 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
11350 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
11360 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
11370 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
11380 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
11390 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
113a0 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
113b0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
113c0 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
113d0 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
113e0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
113f0 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
11400 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
11410 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
11420 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
11430 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
11440 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
11450 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
11460 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
11470 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
11480 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
11490 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
114a0 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
114b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
114c0 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
114d0 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
114e0 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
114f0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
11500 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
11510 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
11520 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
11530 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
11540 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
11550 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
11560 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
11570 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
11580 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11590 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
115a0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
115b0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
115c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
115d0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
115e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
115f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
11600 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
11610 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
11620 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
11630 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
11640 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
11650 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
11660 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
11670 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
11680 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
11690 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
116a0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
116b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
116c0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
116d0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
116e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
116f0 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
11700 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
11710 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
11720 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
11730 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
11740 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
11750 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
11760 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
11770 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
11780 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
11790 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
117a0 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
117b0 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
117c0 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
117d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
117e0 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
117f0 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
11800 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
11810 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
11820 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
11830 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
11840 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
11850 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
11860 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
11870 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
11880 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
11890 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
118a0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
118b0 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
118c0 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
118d0 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
118e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
118f0 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
11900 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
11910 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
11920 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
11930 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
11940 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
11950 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
11960 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
11970 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
11980 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
11990 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
119a0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
119b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
119c0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
119d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
119e0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
11a00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11a10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
11a20 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
11a30 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
11a40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11a50 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11a70 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11a80 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
11a90 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
11aa0 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
11ab0 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
11ac0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
11ad0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
11ae0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
11af0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
11b00 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
11b10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11b20 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
11b30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11b40 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
11b50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11b60 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
11b70 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
11b80 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
11b90 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
11ba0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11bb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11bc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
11bd0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
11be0 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
11bf0 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
11c00 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
11c10 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
11c20 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
11c30 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
11c40 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
11c50 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
11c60 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
11c70 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
11c80 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
11c90 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
11ca0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
11cb0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
11cc0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
11cd0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
11ce0 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
11cf0 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
11d00 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
11d10 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
11d20 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
11d30 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
11d40 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
11d50 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
11d60 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
11d70 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
11d80 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
11d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
11da0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
11db0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
11dc0 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
11dd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11de0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
11df0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
11e00 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
11e10 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
11e20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
11e30 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
11e40 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
11e50 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11e80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11e90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11ea0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11eb0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
11ec0 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
11ed0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11ee0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11f00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
11f10 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
11f20 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
11f30 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
11f40 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
11f50 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
11f60 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
11f70 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
11f80 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
11f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11fa0 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
11fb0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
11fc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11fd0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
11fe0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11ff0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
12000 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
12010 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12020 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
12030 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
12040 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
12050 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
12060 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
12070 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12080 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
120a0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
120b0 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
120c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
120d0 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
120e0 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
120f0 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
12100 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
12110 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
12120 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
12130 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
12140 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
12150 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
12160 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
12170 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
12180 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
12190 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
121a0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
121b0 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
121c0 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
121d0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
121e0 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
121f0 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
12200 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
12210 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
12220 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
12230 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
12240 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
12250 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
12260 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
12270 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
12280 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
12290 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
122a0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
122b0 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
122c0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
122d0 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
122e0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
122f0 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
12300 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
12310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12320 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
12330 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
12340 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
12350 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
12360 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
12370 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
12380 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
12390 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
123a0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
123b0 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
123c0 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
123d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
123e0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
123f0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
12400 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
12410 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
12420 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12430 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
12440 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12450 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
12460 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
12470 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
12480 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12490 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  p);.  if( pBt->b
124a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
124b0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
124c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
124d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
124e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
124f0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
12500 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
12510 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
12520 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
12530 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
12540 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
12550 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
12560 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
12570 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
12580 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
12590 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
125a0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
125b0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
125c0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
125d0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
125e0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
125f0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
12600 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
12610 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
12620 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
12630 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
12640 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
12650 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
12660 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
12670 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
12680 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
12690 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
126a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
126b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
126c0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
126d0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
126e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
126f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
12700 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
12710 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12730 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
12740 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
12750 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
12760 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
12770 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
12780 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
12790 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
127a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
127b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
127c0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
127d0 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG)./*.** Th
127e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
127f0 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
12800 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12810 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
12820 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
12830 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
12840 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
12850 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
12860 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
12870 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
12880 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
12890 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
128a0 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
128b0 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
128c0 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
128d0 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
128e0 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
128f0 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
12900 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
12910 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12920 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
12930 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
12940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12950 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
12960 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
12970 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
12980 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
12990 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
129a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
129b0 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
129c0 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
129d0 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
129e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
129f0 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
12a00 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
12a10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12a20 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
12a30 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
12a40 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
12a50 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
12a60 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  leSize;.}.#endif
12a70 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43   /* SQLITE_HAS_C
12a80 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44  ODEC || SQLITE_D
12a90 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65  EBUG */..#if !de
12aa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12ab0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
12ac0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12ad0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
12ae0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12af0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
12b00 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
12b10 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
12b20 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
12b30 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
12b40 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
12b50 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
12b60 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
12b70 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
12b80 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
12b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12ba0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
12bb0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
12bc0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12bd0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
12be0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
12bf0 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
12c00 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
12c10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12c20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12c30 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
12c40 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
12c50 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
12c60 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
12c70 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
12c80 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
12c90 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
12ca0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
12cb0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
12cc0 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
12cd0 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
12ce0 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
12cf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12d00 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
12d10 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
12d20 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
12d30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d40 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
12d50 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
12d60 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
12d70 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
12d80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12d90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
12da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12db0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
12dc0 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
12dd0 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
12de0 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
12df0 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
12e00 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
12e10 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
12e20 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
12e30 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
12e40 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
12e50 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
12e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
12e70 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
12e80 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
12e90 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
12ea0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
12eb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12ec0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
12ed0 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
12ee0 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
12ef0 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
12f00 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
12f10 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
12f20 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
12f30 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12f40 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
12f50 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
12f60 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
12f70 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
12f80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12f90 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23  .  return b;.}.#
12fa0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
12fb0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
12fc0 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
12fd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12fe0 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
12ff0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
13000 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
13010 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
13020 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13030 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
13040 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
13050 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
13060 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
13070 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
13080 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
13090 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
130a0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
130b0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
130c0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
130d0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
130e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
130f0 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
13100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13110 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
13120 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
13130 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
13140 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13150 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
13160 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
13170 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
13180 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13190 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
131a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
131b0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
131c0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
131d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
131e0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
131f0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
13200 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
13210 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
13220 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
13230 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13240 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
13250 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13260 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
13270 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13280 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
13290 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
132a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
132b0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
132c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
132d0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
132e0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
132f0 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
13300 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
13310 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
13320 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
13330 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13340 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
13350 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
13360 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13370 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
13380 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
13390 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
133a0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
133b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
133c0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
133d0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
133e0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
133f0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
13400 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
13410 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
13420 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
13430 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
13440 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
13450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13460 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13470 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
13480 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
13490 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
134a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
134b0 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
134c0 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
134d0 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
134e0 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
134f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
13500 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
13510 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
13520 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
13530 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
13540 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
13550 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
13560 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
13570 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
13580 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
13590 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
135a0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
135b0 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
135c0 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
135d0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
135e0 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
135f0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
13600 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13610 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
13620 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
13630 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
13640 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
13650 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
13660 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
13670 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
13680 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13690 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
136a0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
136b0 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
136c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
136d0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
136e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
136f0 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
13700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13710 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
13720 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
13730 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
13740 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13750 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
13760 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
13770 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
13780 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13790 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
137a0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
137b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
137d0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
137e0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
137f0 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
13800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13810 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
13820 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
13830 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
13840 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
13850 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
13860 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
13870 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
13880 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
13890 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
138a0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
138b0 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
138c0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
138d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
138e0 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
138f0 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
13900 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
13910 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
13920 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13930 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
13940 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
13950 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
13960 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
13970 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
13980 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
13990 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
139a0 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
139b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
139c0 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
139d0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
139e0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
139f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13a00 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13a10 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
13a20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
13a30 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
13a40 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
13a50 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13a60 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13a70 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13a80 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
13a90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13aa0 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
13ab0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13ac0 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
13ad0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13ae0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
13af0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
13b00 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
13b10 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13b20 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13b30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
13b40 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
13b50 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
13b60 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
13b70 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
13b80 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
13b90 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
13ba0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
13bb0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
13bc0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
13bd0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
13be0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
13bf0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
13c00 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
13c10 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
13c20 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
13c30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
13c40 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
13c50 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
13c60 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
13c70 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
13c80 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
13c90 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
13ca0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
13cb0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
13cc0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
13cd0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
13ce0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
13cf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
13d00 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
13d10 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
13d20 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
13d30 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
13d40 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
13d50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
13d60 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
13d70 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
13d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
13da0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13db0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
13dc0 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
13dd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
13de0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13df0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13e10 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
13e20 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
13e40 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
13e50 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
13e60 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
13e70 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
13e80 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
13e90 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13ea0 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
13eb0 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
13ec0 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
13ed0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
13ee0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13ef0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13f00 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13f10 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13f20 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13f30 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
13f40 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
13f50 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
13f60 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
13f70 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
13f80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13f90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13fa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
13fb0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
13fc0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
13fd0 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13fe0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13ff0 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
14000 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
14010 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14020 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
14030 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
14040 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14050 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14060 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
14070 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
14080 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
14090 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
140a0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
140b0 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
140c0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
140d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
140e0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
140f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14100 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
14110 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
14120 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
14130 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
14140 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
14150 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
14160 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
14170 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
14180 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
14190 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
141a0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
141b0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
141c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
141d0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
141e0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
141f0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
14200 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
14210 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
14220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
14230 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14240 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
14250 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14260 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
14270 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
14280 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
14290 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
142a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
142b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
142c0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
142d0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
142e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
14310 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
14320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14330 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
14340 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
14350 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
14360 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
14370 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
14380 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
14390 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
143a0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
143b0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
143c0 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
143d0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
143e0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
143f0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
14400 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
14410 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
14420 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
14430 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
14440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14450 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
14460 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14470 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
14480 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
14490 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
144a0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
144b0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
144c0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
144d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
144e0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
144f0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
14500 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
14510 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
14520 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
14530 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
14540 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
14550 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
14560 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
14570 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
14580 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
14590 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
145a0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
145b0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
145c0 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
145d0 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
145e0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
145f0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
14600 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
14610 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
14620 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
14630 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
14640 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
14650 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
14660 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
14670 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
14680 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
14690 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
146a0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
146b0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
146c0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
146d0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
146e0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
146f0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
14700 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
14710 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
14720 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
14730 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
14740 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14750 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
14760 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
14770 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
14780 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
14790 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
147a0 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
147b0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
147c0 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
147d0 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
147e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
147f0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
14800 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
14810 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
14820 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
14830 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
14840 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
14850 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
14860 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
14870 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
14880 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
14890 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
148a0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
148b0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
148c0 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
148d0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
148e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
148f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14900 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
14910 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
14920 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
14930 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
14940 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
14950 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14960 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
14970 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
14980 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
14990 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
149a0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
149b0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
149c0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
149d0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
149e0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
149f0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
14a00 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
14a10 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
14a20 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
14a30 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
14a40 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
14a50 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
14a60 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
14a70 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
14a80 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
14a90 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
14aa0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
14ab0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
14ac0 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
14ad0 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
14ae0 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
14af0 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
14b00 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
14b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
14b20 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
14b30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
14b40 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
14b50 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
14b60 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
14b70 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
14b80 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
14b90 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
14ba0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
14bb0 7c 7c 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 29  || pCur->wrFlag)
14bc0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
14bd0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
14be0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
14bf0 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
14c00 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
14c10 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
14c20 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
14c30 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
14c40 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
14c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
14c60 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
14c70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14c80 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
14c90 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
14ca0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
14cb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14cc0 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
14cd0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
14ce0 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
14cf0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
14d00 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
14d10 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
14d20 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
14d30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
14d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14d50 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14d60 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
14d70 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
14d80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14d90 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14da0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
14db0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
14dc0 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
14dd0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
14de0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
14df0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14e00 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
14e10 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
14e20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14e30 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
14e40 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
14e50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
14e60 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
14e70 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  er)==1 );.    as
14e80 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
14e90 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
14ea0 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
14eb0 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42  >pPage1);.    pB
14ec0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
14ed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
14ee0 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
14ef0 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
14f00 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
14f10 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
14f20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
14f30 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
14f40 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
14f50 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
14f60 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
14f70 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
14f80 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14f90 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
14fa0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
14fb0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
14fc0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
14fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14fe0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14ff0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15000 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
15010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15020 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
15030 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
15040 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
15050 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
15060 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15070 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
15080 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
15090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
150a0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
150b0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
150c0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
150d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
150e0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
150f0 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
15100 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
15110 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
15120 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
15130 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
15140 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
15150 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
15160 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
15170 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
15180 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
15190 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
151a0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
151b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
151c0 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
151d0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
151e0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
151f0 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
15200 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
15210 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
15220 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
15230 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
15240 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
15250 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
15260 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
15270 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
15280 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15290 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
152a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
152b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
152c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
152d0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
152e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
152f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15300 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
15310 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
15320 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
15330 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
15340 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
15350 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
15360 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
15370 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
15380 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
15390 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
153a0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
153b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
153c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
153d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
153e0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
153f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
15400 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
15410 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
15420 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
15430 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
15440 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
15450 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
15460 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
15470 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
15480 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
15490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
154a0 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
154b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
154c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
154d0 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
154e0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
154f0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
15500 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
15510 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15530 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
15540 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
15550 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
15560 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
15570 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
15580 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15590 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
155a0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
155b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
155c0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
155d0 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
155e0 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
155f0 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
15600 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
15610 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
15620 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
15630 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
15640 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
15650 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
15660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
15670 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
15680 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
15690 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
156a0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
156b0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
156c0 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
156d0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
156e0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
156f0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
15700 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
15710 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
15720 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
15730 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
15740 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
15750 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
15760 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
15770 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
15780 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
15790 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
157a0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
157b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
157c0 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
157d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
157e0 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
157f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15800 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
15810 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15820 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
15830 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15840 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
15850 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
15860 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
15870 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
15880 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
15890 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
158a0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
158b0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
158c0 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
158d0 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
158e0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
158f0 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
15900 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
15910 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
15920 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
15930 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
15940 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
15950 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
15960 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
15970 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
15980 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
15990 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
159a0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
159b0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
159c0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
159d0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
159e0 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
159f0 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
15a00 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
15a10 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
15a20 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
15a30 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
15a40 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
15a50 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
15a60 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
15a70 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
15a80 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
15a90 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
15aa0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
15ab0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
15ac0 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
15ad0 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
15ae0 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
15af0 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
15b00 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
15b10 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
15b20 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
15b30 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
15b40 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
15b50 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
15b60 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
15b70 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
15b80 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
15b90 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
15ba0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
15bb0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
15bc0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15bd0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
15be0 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
15bf0 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
15c00 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
15c10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15c20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
15c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15c50 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
15c60 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
15c70 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
15c80 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
15c90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
15ca0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
15cb0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
15cc0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
15cd0 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
15ce0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
15cf0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
15d00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
15d10 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15d20 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
15d30 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
15d40 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
15d50 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
15d60 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15d70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
15d80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15d90 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
15da0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
15db0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
15dc0 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
15dd0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
15de0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
15df0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
15e00 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
15e10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15e20 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
15e30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15e40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
15e50 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
15e60 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15e70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15e80 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15e90 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
15ea0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
15eb0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
15ec0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
15ed0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
15ee0 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
15ef0 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
15f00 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
15f10 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
15f20 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
15f30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
15f40 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
15f50 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
15f60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15f70 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
15f80 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
15f90 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
15fa0 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  G)!=0.  ){.    p
15fb0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
15fc0 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
15fd0 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
15fe0 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
15ff0 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
16000 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
16010 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
16020 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
16030 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
16040 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
16050 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
16060 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
16070 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16080 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
16090 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
160a0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
160b0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
160c0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
160d0 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
160e0 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
160f0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
16100 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
16110 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
16120 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
16130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
16140 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
16150 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
16160 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
16170 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
16180 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
16190 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
161a0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
161b0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
161c0 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
161d0 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
161e0 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
161f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
16200 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
16210 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
16220 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
16230 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
16240 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
16250 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
16260 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
16270 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
16280 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16290 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
162a0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
162b0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
162c0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
162d0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
162e0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
162f0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
16300 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
16310 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
16320 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
16330 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
16340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
16350 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
16360 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
16370 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
16380 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
16390 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
163a0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
163b0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
163c0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
163d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
163e0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
163f0 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
16400 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
16410 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
16420 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
16430 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
16440 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
16450 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
16460 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
16470 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
16480 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
16490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
164a0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
164b0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
164c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
164d0 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
164e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
164f0 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
16500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
16510 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
16520 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
16530 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
16540 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
16550 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
16560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
16580 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
16590 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
165a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
165b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
165c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
165d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
165e0 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
165f0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
16600 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
16610 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
16620 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
16630 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
16640 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
16650 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
16660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16670 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
16680 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
16690 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
166a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
166b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
166c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
166d0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
166e0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
166f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
16700 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
16710 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
16720 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
16730 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
16740 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
16750 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
16760 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
16770 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
16780 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
16790 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
167a0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
167b0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
167c0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
167d0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
167e0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
167f0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
16800 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
16810 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
16820 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
16830 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
16840 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
16850 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
16860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16870 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16890 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
168a0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
168b0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
168c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
168d0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
168e0 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
168f0 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
16900 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
16910 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
16920 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
16930 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
16940 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
16950 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
16960 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
16970 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
16980 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
16990 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
169a0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
169b0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
169c0 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
169d0 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
169e0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
169f0 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
16a00 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
16a10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
16a20 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
16a30 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
16a40 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
16a50 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
16a60 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
16a70 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
16a80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
16a90 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
16aa0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
16ab0 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
16ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16ad0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
16ae0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
16af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16b10 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
16b20 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
16b30 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
16b40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16b50 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
16b60 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
16b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
16b80 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
16b90 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
16ba0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
16bb0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
16bc0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
16bd0 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
16be0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
16bf0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
16c00 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
16c10 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
16c20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
16c30 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
16c40 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
16c50 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
16c60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16c70 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
16c80 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
16c90 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
16ca0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
16cb0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
16cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16cd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16ce0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
16cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16d00 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
16d10 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
16d20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
16d30 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
16d40 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
16d50 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
16d60 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
16d70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
16d80 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
16d90 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
16da0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
16db0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
16dc0 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
16dd0 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
16de0 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
16df0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
16e20 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
16e30 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16e60 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
16e70 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
16e80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16eb0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
16ec0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
16ed0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
16ee0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
16ef0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
16f00 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
16f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16f20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
16f30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
16f40 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
16f50 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
16f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16f70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
16f80 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16f90 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
16fa0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
16fb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
16fc0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
16fd0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
16fe0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
16ff0 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
17000 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
17010 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
17020 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
17030 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
17040 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
17050 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
17060 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
17070 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
17080 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
17090 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
170a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
170b0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
170c0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
170d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
170e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
170f0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
17100 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
17110 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
17120 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
17130 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
17140 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
17150 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
17160 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
17170 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
17180 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
17190 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
171a0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
171b0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
171c0 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
171d0 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
171e0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
171f0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
17200 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
17210 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
17220 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
17230 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
17240 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
17250 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
17260 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
17270 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
172a0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
172b0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
172c0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
172d0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
172e0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
172f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17300 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
17310 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
17320 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
17330 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
17340 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
17350 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
17360 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
17370 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
17380 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
17390 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
173a0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
173b0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
173c0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
173d0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
173e0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
173f0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
17400 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
17410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17420 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
17430 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
17440 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
17450 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
17460 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
17470 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
17480 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
17490 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
174a0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
174b0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
174c0 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
174d0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
174e0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
174f0 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
17500 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
17510 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17520 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
17530 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
17540 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
17550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
17560 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
17570 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
17580 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
17590 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49  ell;..    btreeI
175a0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
175b0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
175c0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
175d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
175e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
175f0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
17600 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
17610 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
17620 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
17630 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
17640 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
17650 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
17660 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
17670 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
17680 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
17690 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20  low.         && 
176a0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
176b0 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61  flow+3<=pPage->a
176c0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
176d0 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26  Page.         &&
176e0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
176f0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17700 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20  erflow]).       
17710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
17720 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
17730 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
17740 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
17750 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
17760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17770 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
17780 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
17790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
177a0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
177b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
177c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
177d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
177e0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
177f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
17800 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
17810 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
17820 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
17830 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
17840 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
17850 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
17860 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17870 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
17880 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
17890 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
178a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
178b0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
178c0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
178d0 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
178e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
178f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
17900 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
17910 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
17920 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
17930 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
17940 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
17950 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
17960 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
17970 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
17980 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
17990 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
179a0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
179b0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
179c0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
179d0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
179e0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
179f0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
17a00 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
17a10 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
17a20 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
17a30 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
17a40 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
17a50 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
17a60 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
17a70 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
17a80 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
17a90 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
17aa0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
17ab0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
17ac0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
17ad0 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17af0 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
17b00 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
17b10 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
17b20 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
17b30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
17b40 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
17b50 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
17b60 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
17b70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
17b80 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
17b90 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
17ba0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
17bc0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
17bd0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
17be0 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
17bf0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
17c00 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
17c10 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
17c20 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
17c30 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
17c40 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
17c50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
17c60 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
17c70 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
17c80 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
17c90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17ca0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
17cb0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17cc0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
17cd0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
17ce0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
17cf0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
17d00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17d10 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
17d20 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
17d30 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
17d40 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
17d50 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
17d60 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
17d70 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
17d80 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
17d90 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
17da0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
17db0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
17dc0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
17dd0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
17de0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
17df0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
17e00 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
17e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17e20 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
17e30 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
17e40 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
17e50 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
17e60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17e70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17e80 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
17e90 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
17ea0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
17eb0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
17ec0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
17ed0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
17ee0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
17ef0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
17f00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
17f10 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
17f20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
17f30 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
17f40 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
17f50 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
17f60 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
17f70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
17f80 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
17f90 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
17fa0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
17fb0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
17fc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
17fd0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
17fe0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
17ff0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
18000 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
18010 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
18020 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
18030 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
18040 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
18050 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
18060 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18070 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
18080 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
18090 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
180a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
180b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
180c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
180d0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
180e0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
180f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
18100 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
18110 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
18120 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
18130 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
18140 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
18150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18170 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18190 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
181a0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
181b0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
181c0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
181d0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
181e0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
181f0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
18200 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
18210 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
18220 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
18230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
18240 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
18250 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
18260 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
18270 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
18280 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
18290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
182a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
182b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
182c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
182d0 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
182e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
182f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18300 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
18310 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
18320 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18330 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
18340 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
18350 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
18360 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
18370 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
18380 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
18390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
183a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
183b0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
183c0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
183d0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
183e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
183f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
18400 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
18410 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
18420 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
18430 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
18440 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
18450 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
18460 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
18470 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
18480 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
18490 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
184a0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
184b0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
184c0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
184d0 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
184e0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
184f0 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
18500 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
18510 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
18520 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
18530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
18540 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
18550 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
18560 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
18570 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18580 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
18590 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
185a0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
185b0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
185c0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
185d0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
185e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
185f0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
18600 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
18610 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
18620 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
18630 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
18640 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
18650 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
18660 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
18670 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
18680 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
18690 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
186a0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
186b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
186c0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
186d0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
186e0 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
186f0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
18700 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
18710 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
18720 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
18730 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
18740 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
18750 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
18760 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
18770 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  ommmit .** opera
18780 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
18790 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
187a0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
187b0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
187c0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
187d0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
187e0 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
187f0 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
18800 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
18810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18820 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
18830 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
18840 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
18850 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18860 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
18870 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
18880 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
18890 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
188a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
188b0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
188c0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
188d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
188e0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
188f0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
18900 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
18910 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
18920 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
18930 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
18940 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
18950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18960 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
18970 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
18980 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
18990 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
189a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
189b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
189c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
189d0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
189e0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
189f0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
18a00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18a10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
18a20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
18a30 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
18a40 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
18a50 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
18a60 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
18a70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
18a80 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
18a90 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
18aa0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
18ab0 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
18ac0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
18ad0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
18ae0 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
18af0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
18b00 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
18b10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
18b20 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
18b30 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
18b40 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
18b50 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
18b60 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
18b70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18b80 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
18b90 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
18ba0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
18bb0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
18bc0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
18bd0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
18be0 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
18bf0 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
18c00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18c20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18c40 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
18c50 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
18c60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18c70 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
18c80 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
18c90 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
18ca0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
18cb0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
18cc0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
18cd0 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
18ce0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
18cf0 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
18d00 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
18d10 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
18d20 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
18d30 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
18d40 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
18d50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18d60 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
18d70 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
18d80 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
18d90 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
18da0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
18db0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
18dc0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
18dd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18de0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18df0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18e00 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
18e10 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
18e20 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
18e30 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
18e40 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
18e50 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
18e60 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
18e70 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
18e80 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
18e90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
18ea0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
18eb0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
18ec0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
18ed0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
18ee0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
18ef0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
18f00 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
18f10 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
18f20 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
18f30 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
18f40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18f50 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
18f60 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
18f70 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
18f80 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
18f90 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
18fa0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
18fb0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
18fc0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18fd0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18fe0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
18ff0 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
19000 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
19010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19030 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
19040 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
19050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
19070 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
19080 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
19090 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
190a0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
190b0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
190c0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
190d0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
190e0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
190f0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
19100 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
19110 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
19120 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19130 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
19140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19150 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
19160 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19170 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
19180 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
19190 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
191a0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
191b0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
191c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
191d0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
191e0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
191f0 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
19200 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
19210 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
19220 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
19230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19240 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
19250 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
19260 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
19270 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
19280 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
19290 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
192a0 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
192b0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
192c0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
192d0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
192e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
192f0 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
19300 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
19310 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
19320 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
19330 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
19340 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
19350 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
19360 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19390 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
193a0 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
193b0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
193e0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
193f0 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
19400 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
19410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19420 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
19430 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
19440 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
19450 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
19460 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
19470 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
19480 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
19490 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
194a0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
194b0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
194c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
194d0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
194e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
194f0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
19500 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
19510 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19520 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
19530 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
19540 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
19550 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
19560 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
19570 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
19580 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
19590 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
195a0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
195b0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
195c0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
195d0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
195e0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
195f0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
19600 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
19610 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
19620 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
19630 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
19640 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
19650 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
19660 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
19670 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
19680 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
19690 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
196a0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
196b0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
196c0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
196d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
196e0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
196f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
19700 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19710 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
19720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19730 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19740 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19750 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
19760 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19770 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
19780 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19790 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
197a0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
197b0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
197c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
197d0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
197e0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
197f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
19800 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
19810 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
19820 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
19830 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
19840 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
19850 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19860 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19870 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
19880 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
19890 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
198a0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
198b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
198c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
198d0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
198e0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
198f0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
19900 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
19910 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
19920 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19960 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19970 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19980 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19990 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
199a0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
199b0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
199c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
199d0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
199e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
199f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19a10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19a20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19a30 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
19a40 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
19a50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
19a60 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
19a70 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
19a80 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
19a90 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
19aa0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
19ab0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
19ac0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
19ad0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
19ae0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
19af0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
19b00 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
19b10 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
19b20 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
19b30 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
19b40 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
19b50 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
19b60 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
19b70 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
19b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
19b90 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
19ba0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19bb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19bc0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
19bd0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
19be0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
19bf0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
19c00 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19c10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
19c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19c30 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19c40 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
19c50 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
19c60 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
19c70 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
19c80 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
19c90 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
19ca0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
19cb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19cc0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
19cd0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
19ce0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
19cf0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
19d00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19d10 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
19d20 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
19d30 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
19d40 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
19d50 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
19d60 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
19d70 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
19d80 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
19d90 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
19da0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
19db0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
19dc0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
19dd0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19de0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
19df0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19e00 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19e10 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
19e20 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
19e30 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
19e40 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
19e50 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
19e60 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
19e70 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
19e80 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
19e90 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
19ea0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
19eb0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
19ec0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
19ed0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19ef0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19f00 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
19f10 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
19f20 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
19f30 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
19f40 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
19f50 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
19f60 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
19f70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19f80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19f90 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
19fa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
19fb0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
19fc0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
19fd0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
19fe0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
19ff0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a000 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1a010 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1a020 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1a030 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1a040 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1a050 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1a060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1a070 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1a080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a090 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1a0a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1a0b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1a0c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1a0d0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1a0e0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1a0f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1a100 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1a110 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a120 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1a130 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1a140 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1a150 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1a160 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1a170 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a190 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1a1a0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1a1b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1a1c0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1a1d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1a1e0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1a1f0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1a200 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1a210 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1a220 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1a230 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1a240 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1a250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a260 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1a270 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1a280 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1a290 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1a2a0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1a2b0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1a2c0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1a2d0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1a2e0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1a2f0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1a300 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1a310 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1a320 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1a330 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1a340 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1a350 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1a360 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1a370 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1a380 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1a390 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a3a0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1a3b0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1a3c0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1a3d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1a3e0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1a3f0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1a400 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1a410 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a430 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1a440 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1a450 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1a460 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1a470 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1a480 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1a490 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1a4a0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1a4b0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1a4c0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1a4d0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1a4e0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1a4f0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1a500 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1a510 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1a520 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1a530 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1a540 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1a550 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1a560 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1a570 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1a580 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1a590 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1a5a0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1a5b0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1a5c0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1a5d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1a5e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a5f0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1a600 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a610 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1a620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1a630 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1a640 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1a650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1a660 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1a670 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1a680 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1a690 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1a6a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1a6b0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1a6c0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1a6d0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1a6e0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1a6f0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1a700 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1a710 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1a720 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1a730 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1a740 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1a750 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1a760 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1a770 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1a780 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1a790 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1a7a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a7b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1a7c0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1a7d0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1a7e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a7f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1a800 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a810 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1a820 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a830 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1a840 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1a850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a860 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a870 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1a880 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1a890 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1a8a0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1a8b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a8c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1a8d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a8e0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1a8f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1a900 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1a910 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1a920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a930 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1a940 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1a950 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1a960 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1a970 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a980 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1a990 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1a9a0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a9b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a9c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a9e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1a9f0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1aa00 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1aa10 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1aa20 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1aa30 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1aa40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1aa50 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1aa60 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1aa70 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1aa80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1aa90 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1aaa0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1aab0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1aac0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1aad0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1aae0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1aaf0 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1ab00 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1ab10 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1ab20 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1ab30 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1ab40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1ab50 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1ab60 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1ab70 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1ab80 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1ab90 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1aba0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1abb0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1abc0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1abd0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
1abe0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
1abf0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1ac00 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
1ac10 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
1ac20 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1ac30 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
1ac40 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
1ac50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ac60 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1ac70 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
1ac80 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1ac90 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
1aca0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1acb0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
1acc0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
1acd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ace0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
1acf0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
1ad00 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1ad10 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
1ad20 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
1ad30 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
1ad40 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
1ad50 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
1ad60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1ad70 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
1ad80 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
1ad90 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
1ada0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1adb0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1adc0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
1add0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
1ade0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1adf0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ae00 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
1ae10 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1ae20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1ae30 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1ae40 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
1ae50 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
1ae60 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
1ae70 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
1ae80 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
1ae90 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
1aea0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
1aeb0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
1aec0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
1aed0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1aee0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1aef0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1af00 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1af10 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1af20 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1af30 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1af40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1af50 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1af60 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1af70 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1af80 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1af90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1afa0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1afb0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1afc0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1afd0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1afe0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1aff0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1b000 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1b010 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1b020 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1b030 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1b040 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1b050 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1b060 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1b070 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1b080 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1b090 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1b0a0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1b0b0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1b0c0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1b0d0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1b0e0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1b0f0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1b100 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b110 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1b120 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b130 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1b140 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1b150 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1b160 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b170 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1b180 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1b190 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1b1a0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1b1b0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1b1c0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1b1d0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1b1e0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1b1f0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1b200 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1b210 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1b220 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b230 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1b240 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1b250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1b260 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1b270 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1b280 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1b290 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1b2a0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1b2b0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1b2c0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1b2d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b2e0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1b2f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1b300 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1b310 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1b320 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1b330 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1b340 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1b350 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1b360 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1b370 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1b380 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1b390 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1b3a0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1b3b0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1b3c0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1b3d0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1b3e0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1b3f0 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1b400 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1b410 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1b420 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1b430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b440 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1b450 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1b460 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1b470 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1b480 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1b490 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b4a0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1b4b0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1b4c0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1b4d0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1b4e0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1b4f0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1b500 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b510 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1b520 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b530 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1b540 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1b550 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1b560 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1b570 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1b580 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1b590 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1b5a0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1b5b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b5c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1b5d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1b5e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1b5f0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1b600 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b610 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b620 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1b630 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1b640 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1b650 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1b660 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1b670 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1b680 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b690 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1b6a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1b6b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b6c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b6d0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1b6e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1b6f0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1b700 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1b710 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1b720 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1b730 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1b740 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b760 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1b770 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1b780 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1b790 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b7a0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1b7b0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1b7c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b7d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b7e0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1b7f0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1b800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b820 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b830 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1b840 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b850 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b860 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1b870 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1b880 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1b890 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1b8a0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1b8b0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1b8c0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1b8d0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1b8e0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1b8f0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1b900 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1b910 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1b920 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1b930 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1b940 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1b950 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1b960 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1b970 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1b980 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1b990 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1b9a0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1b9b0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1b9c0 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1b9d0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1b9e0 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1b9f0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1ba00 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1ba10 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1ba20 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1ba30 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1ba40 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1ba50 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1ba60 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1ba70 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1ba80 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1ba90 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1baa0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1bab0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1bac0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1bad0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1bae0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1baf0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1bb00 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1bb10 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1bb20 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1bb30 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1bb40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bb50 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1bb60 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1bb70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1bb80 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1bb90 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1bba0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1bbb0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1bbc0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1bbd0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1bbe0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1bbf0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1bc00 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1bc10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1bc20 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1bc30 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1bc40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1bc50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bc60 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1bc70 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1bc80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1bc90 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1bca0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1bcb0 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1bcc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1bcd0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1bce0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1bcf0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1bd00 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1bd10 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1bd20 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1bd30 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1bd40 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1bd50 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1bd60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1bd70 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1bd80 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1bd90 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1bda0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1bdb0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1bdc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bdd0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1bde0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1bdf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1be00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1be10 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1be20 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1be30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1be40 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1be50 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1be60 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1be70 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1be80 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1be90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1bea0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1beb0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1bec0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1bed0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1bee0 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1bef0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1bf00 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1bf10 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bf20 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1bf30 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1bf40 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1bf50 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1bf60 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1bf70 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1bf80 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1bf90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1bfc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1bfd0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1bfe0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1bff0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1c000 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1c010 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1c020 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1c030 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1c040 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1c050 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1c060 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1c070 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1c080 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1c090 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
1c0a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
1c0b0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
1c0c0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1c0d0 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
1c0e0 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
1c0f0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
1c100 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
1c110 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1c120 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
1c130 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c140 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
1c150 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
1c160 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1c170 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1c180 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
1c190 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
1c1a0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1c1b0 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
1c1c0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1c1d0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1c1e0 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1c1f0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1c200 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1c210 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1c220 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c230 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c240 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1c250 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
1c260 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c270 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c280 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
1c290 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1c2a0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1c2b0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1c2c0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1c2d0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1c2e0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1c2f0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1c300 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1c310 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1c320 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1c330 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1c340 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1c350 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1c360 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1c370 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1c380 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1c390 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1c3a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1c3b0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1c3c0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1c3d0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1c3e0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1c3f0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1c400 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1c410 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1c420 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1c430 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1c440 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1c450 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1c460 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1c470 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1c480 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1c490 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1c4a0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1c4b0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1c4c0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1c4d0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1c4e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1c4f0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1c500 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1c510 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1c520 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1c530 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1c540 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1c550 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1c560 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1c570 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1c580 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1c590 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1c5a0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1c5b0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1c5c0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1c5d0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1c5e0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1c5f0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1c600 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1c610 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1c620 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1c630 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c640 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1c650 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1c660 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1c670 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c680 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1c690 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c6a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1c6b0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1c6c0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1c6d0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1c6e0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1c6f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c700 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1c710 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1c720 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1c730 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1c740 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c750 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c760 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1c770 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1c780 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1c790 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1c7a0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1c7b0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1c7c0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1c7d0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1c7e0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1c7f0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1c800 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1c810 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1c820 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1c830 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1c840 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1c850 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1c860 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1c870 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1c880 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1c890 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1c8a0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1c8b0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1c8c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c8d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c8e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1c8f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1c900 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1c910 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1c920 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1c930 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1c940 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1c950 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1c960 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1c970 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1c980 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1c990 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1c9a0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1c9b0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1c9c0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1c9d0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1c9e0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1c9f0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1ca00 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1ca10 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1ca20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1ca30 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1ca40 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1ca50 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1ca60 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1ca70 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1ca80 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1ca90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1caa0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1cab0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1cac0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1cad0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1cae0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1caf0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1cb00 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1cb10 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1cb20 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1cb30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1cb40 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1cb50 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1cb60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1cb70 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1cb80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1cb90 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1cba0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1cbb0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1cbc0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1cbd0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1cbe0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1cbf0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1cc00 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1cc10 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1cc20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1cc30 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1cc40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1cc50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cc60 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1cc70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1cc80 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1cc90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1ccb0 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1ccc0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1ccd0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1cce0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1ccf0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1cd00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cd10 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1cd20 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1cd30 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1cd40 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1cd50 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1cd60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1cd70 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1cd80 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1cd90 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1cda0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1cdb0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1cdc0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1cdd0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1cde0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1cdf0 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1ce00 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1ce10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1ce20 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1ce30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1ce40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1ce50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ce60 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1ce70 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1ce80 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1ce90 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1cea0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1ceb0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1cec0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1ced0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1cee0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1cef0 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1cf00 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1cf10 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1cf20 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1cf30 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1cf40 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1cf50 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1cf60 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1cf70 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1cf80 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1cf90 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1cfa0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1cfb0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1cfc0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1cfd0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1cfe0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1cff0 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1d000 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1d010 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1d020 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1d030 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1d040 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1d050 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1d060 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1d070 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1d080 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1d090 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1d0a0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1d0b0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1d0c0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1d0d0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1d0e0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1d0f0 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1d100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1d110 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1d120 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1d130 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1d140 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1d150 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1d160 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1d170 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1d180 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1d190 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1d1a0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1d1b0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1d1c0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1d1d0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1d1e0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1d1f0 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1d200 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1d210 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1d220 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1d230 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1d240 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1d250 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1d260 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1d270 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1d280 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1d290 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1d2a0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1d2b0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1d2c0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1d2d0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1d2e0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1d2f0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1d300 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1d310 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1d320 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1d330 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1d340 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1d350 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1d360 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d370 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1d380 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1d390 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1d3a0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1d3b0 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1d3c0 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1d3d0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1d3e0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1d3f0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1d420 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1d430 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1d460 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1d470 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1d4a0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1d4b0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1d4c0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1d4d0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1d4e0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1d4f0 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1d500 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1d510 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1d540 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1d550 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d560 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1d570 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1d580 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1d590 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1d5a0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1d5b0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1d5c0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d5d0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1d5e0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1d5f0 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1d600 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1d610 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1d620 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1d630 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1d640 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1d650 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1d660 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1d670 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1d680 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1d690 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1d6a0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1d6b0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1d6c0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1d6d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1d6e0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d6f0 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1d700 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1d710 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1d720 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d730 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d740 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1d750 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1d760 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1d770 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1d780 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1d790 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1d7a0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1d7b0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1d7c0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d7d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1d7e0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1d7f0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1d800 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1d810 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1d820 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1d830 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1d840 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1d850 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1d860 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1d870 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
1d880 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
1d890 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1d8a0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1d8b0 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
1d8c0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
1d8d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1d8e0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1d8f0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1d900 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1d910 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1d920 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1d930 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1d940 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1d950 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1d960 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1d970 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1d980 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1d990 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1d9a0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1d9b0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1d9c0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1d9d0 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
1d9e0 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
1d9f0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1da00 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1da10 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1da20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1da30 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1da40 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1da50 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1da60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1da70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1da80 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1da90 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1daa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1dab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1dac0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1db00 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1db40 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1db50 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1db90 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1dba0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1dbb0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1dbd0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1dbe0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1dbf0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1dc20 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1dc30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1dc40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dc50 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1dc60 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1dc70 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1dc80 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1dc90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1dca0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1dcb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1dcc0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1dcd0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1dce0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1dcf0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1dd00 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1dd10 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1dd20 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1dd30 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1dd40 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1dd50 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1dd60 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1dd70 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1dd80 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1dd90 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1dda0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1ddb0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1ddc0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1ddd0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1dde0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1ddf0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1de00 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
1de10 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
1de20 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1de30 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
1de40 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1de50 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
1de60 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
1de70 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
1de80 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
1de90 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
1dea0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
1deb0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
1dec0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
1ded0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
1dee0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
1def0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
1df00 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
1df10 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
1df20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
1df30 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
1df40 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
1df50 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1df60 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
1df70 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
1df80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1df90 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
1dfa0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
1dfb0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
1dfc0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
1dfd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1dfe0 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1dff0 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1e000 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1e010 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1e020 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1e030 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1e040 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1e050 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1e060 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1e070 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1e080 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1e090 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1e0a0 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1e0b0 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1e0c0 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1e0d0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1e0e0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1e0f0 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1e100 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1e110 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1e120 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1e130 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1e140 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1e150 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1e160 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1e170 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1e180 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1e190 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1e1a0 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1e1b0 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1e1c0 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1e1d0 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1e1e0 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1e1f0 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1e200 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1e210 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1e220 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1e230 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1e240 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1e250 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1e260 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1e270 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1e280 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1e290 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1e2a0 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1e2b0 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1e2c0 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1e2d0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1e2e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1e2f0 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1e300 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1e310 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1e320 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1e330 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1e340 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1e350 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1e360 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1e370 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1e380 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1e390 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1e3a0 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1e3b0 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1e3c0 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1e3d0 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1e3e0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1e3f0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1e400 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1e410 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1e420 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e430 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1e440 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1e450 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1e460 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1e470 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1e480 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1e490 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1e4a0 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1e4b0 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1e4c0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1e4d0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1e4e0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1e4f0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1e500 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1e510 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1e520 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1e530 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1e540 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e550 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1e560 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e570 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1e580 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1e590 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1e5a0 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1e5b0 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1e5c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e5d0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1e5e0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1e5f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1e600 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1e610 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1e620 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1e630 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1e640 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1e650 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e660 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e670 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e680 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1e690 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1e6a0 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1e6b0 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1e6c0 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1e6d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1e6e0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1e6f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e700 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e720 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e730 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
1e740 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1e750 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
1e760 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1e770 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
1e780 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1e790 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
1e7a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1e7b0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
1e7c0 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
1e7d0 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
1e7e0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
1e7f0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
1e800 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
1e810 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
1e820 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
1e830 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
1e840 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
1e850 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
1e860 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
1e870 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
1e880 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
1e890 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
1e8a0 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
1e8b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
1e8c0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1e8d0 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
1e8e0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
1e8f0 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
1e900 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
1e910 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
1e920 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
1e930 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
1e940 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
1e950 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
1e960 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
1e970 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
1e980 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
1e990 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
1e9a0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1e9b0 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
1e9c0 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
1e9d0 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
1e9e0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
1e9f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1ea00 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
1ea10 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
1ea20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1ea30 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1ea40 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1ea50 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1ea60 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
1ea70 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
1ea80 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1ea90 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1eaa0 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1eab0 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1eac0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1ead0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
1eae0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1eaf0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1eb00 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1eb10 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1eb20 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1eb30 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1eb40 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1eb50 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1eb60 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1eb70 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1eb80 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1eb90 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1eba0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1ebb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ebc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1ebd0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1ebe0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1ebf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1ec00 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1ec10 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1ec20 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1ec30 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1ec40 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1ec50 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1ec60 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1ec70 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1ec80 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1ec90 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1eca0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1ecb0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1ecc0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1ecd0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1ece0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1ecf0 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1ed00 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1ed10 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
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 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1ed50 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1ed60 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
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 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1eda0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1edb0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1edf0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1ee00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1ee10 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1ee20 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1ee30 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1ee40 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1ee90 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1eee0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1eef0 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1ef30 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1ef40 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1ef50 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1ef60 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1ef70 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1ef80 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1ef90 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1efa0 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1efb0 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1efc0 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1efd0 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1efe0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1eff0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1f000 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1f010 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1f020 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1f030 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1f040 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1f050 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1f060 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1f070 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1f080 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1f090 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1f0a0 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1f0b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f0c0 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1f0d0 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1f0e0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1f0f0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1f100 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1f110 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1f120 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1f130 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1f140 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1f150 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1f160 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1f170 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1f180 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1f190 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1f1a0 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1f1b0 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1f1c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f1d0 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1f1e0 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1f1f0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1f200 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1f210 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1f220 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1f230 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1f240 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1f250 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1f260 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1f270 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1f280 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1f290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f2a0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1f2b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1f2c0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1f2d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f2e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f2f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f300 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1f310 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1f320 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f330 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1f340 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1f350 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1f360 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1f370 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1f380 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1f390 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1f3a0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1f3b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f3c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1f3d0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1f3e0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1f3f0 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1f400 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1f410 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1f420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1f430 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1f440 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1f450 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1f460 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1f470 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1f480 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1f490 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1f4a0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1f4b0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1f4c0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1f4d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f4e0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1f4f0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1f500 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1f510 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1f520 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1f530 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1f540 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1f550 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1f560 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1f570 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1f580 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1f590 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1f5a0 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1f5b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f5c0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1f5d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f5e0 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1f5f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1f600 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1f610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f620 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f630 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1f640 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1f650 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1f660 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1f670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f680 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1f690 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1f6a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1f6b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1f6c0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1f6d0 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1f6e0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1f6f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1f700 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1f710 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1f720 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1f730 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1f740 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1f750 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1f760 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1f770 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1f780 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1f790 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1f7a0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1f7b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1f7c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f7d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1f7e0 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1f7f0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1f800 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1f810 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1f820 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1f830 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1f840 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1f850 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1f860 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1f870 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1f880 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1f890 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1f8a0 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1f8b0 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1f8c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1f8d0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1f8e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1f8f0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1f900 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1f910 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1f920 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1f930 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1f940 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1f950 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1f960 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1f970 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1f980 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1f990 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1f9a0 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1f9b0 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1f9c0 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1f9d0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1f9e0 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1f9f0 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1fa00 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1fa10 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1fa20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1fa30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1fa40 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1fa50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa70 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1fa80 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1fa90 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1faa0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1fab0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1fac0 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1fad0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1fae0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1faf0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1fb00 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1fb10 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb30 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1fb40 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1fb50 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1fb60 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1fb70 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1fb80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fb90 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1fba0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1fbb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1fbc0 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1fbd0 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1fbe0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1fbf0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1fc00 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1fc10 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1fc20 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1fc30 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1fc40 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1fc50 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1fc60 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1fc70 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1fc80 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1fc90 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1fca0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1fcb0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1fcc0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1fcd0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1fce0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1fcf0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1fd00 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1fd10 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1fd20 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1fd30 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1fd40 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1fd50 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1fd60 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1fd70 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1fd80 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1fd90 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1fda0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1fdb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fdc0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1fdd0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1fde0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1fdf0 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1fe00 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1fe10 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1fe20 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1fe30 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1fe40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fe50 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1fe60 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1fe70 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1fe80 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1fe90 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1fea0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1feb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fec0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1fed0 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1fee0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1fef0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ff00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1ff10 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ff20 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1ff30 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50   (ppPage==0) ? P
1ff40 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
1ff50 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  Y : 0);.    asse
1ff60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1ff70 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
1ff80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ff90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ffa0 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
1ffb0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
1ffc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
1ffd0 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
1ffe0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
1fff0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
20000 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
20010 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
20020 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
20030 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
20040 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
20050 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
20060 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
20070 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
20080 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
20090 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
200a0 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
200b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
200c0 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
200d0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
200e0 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
200f0 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
20100 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
20110 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
20120 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
20130 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
20140 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
20150 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
20160 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
20170 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20180 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
20190 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
201a0 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
201b0 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
201c0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
201d0 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
201e0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
201f0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
20200 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
20210 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
20220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
20230 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
20240 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
20250 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20260 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
20270 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20290 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
202a0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
202b0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
202c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
202d0 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
202e0 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20300 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
20310 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
20320 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
20330 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
20340 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
20350 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
20360 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
20370 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
20380 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
20390 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
203a0 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
203b0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
203c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
203d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
203e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
203f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20400 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
20410 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
20420 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
20430 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
20440 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
20450 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
20460 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
20470 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
20480 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
20490 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
204a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
204b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
204c0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
204d0 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
204e0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
204f0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
20500 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
20510 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
20520 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65  nting to. If the
20530 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65   eOp.** paramete
20540 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20  r is 0, this is 
20550 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
20560 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e   (data copied in
20570 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
20580 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e  f). If it is non
20590 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28  -zero, a write (
205a0 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
205b0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
205c0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
205d0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
205e0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
205f0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
20600 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
20610 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
20620 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
20630 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
20640 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
20650 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
20660 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
20670 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
20680 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
20690 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
206a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
206b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75  *.** If the BtCu
206c0 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48  rsor.isIncrblobH
206d0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
206e0 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  t, and the curre
206f0 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74  nt.** cursor ent
20700 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
20710 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
20720 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  es, this functio
20730 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73  n.** allocates s
20740 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
20750 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68  ily popluates th
20760 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20770 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61  list .** cache a
20780 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
20790 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65  Overflow). Subse
207a0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
207b0 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f  this.** cache to
207c0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
207d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
207e0 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69  fset more effici
207f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
20800 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20810 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
20820 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
20830 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
20840 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
20850 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
20860 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
20870 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
20880 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
20890 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
208a0 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
208b0 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
208c0 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
208d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
208e0 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
208f0 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
20900 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
20910 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
20920 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
20930 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
20940 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
20950 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
20960 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
20970 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
20980 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
20990 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
209a0 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
209b0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
209c0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
209d0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
209e0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
209f0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
20a00 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
20a10 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
20a20 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
20a30 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
20a40 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
20a50 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
20a60 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
20a70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20a80 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
20a90 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
20aa0 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
20ab0 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
20ac0 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
20ad0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
20ae0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
20af0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20b00 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
20b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20b20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
20b30 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
20b40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
20b50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20b60 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
20b70 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
20b80 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
20b90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
20ba0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
20bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
20bc0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
20bd0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
20be0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
20bf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20c00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20c10 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20c20 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20c30 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20c40 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
20c50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20c60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20c70 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
20c80 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
20c90 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
20ca0 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
20cb0 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
20cc0 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
20cd0 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75  y ? 0 : (int)pCu
20ce0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
20cf0 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73    if( NEVER(offs
20d00 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
20d10 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20  ur->info.nData) 
20d20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
20d30 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
20d40 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
20d50 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
20d60 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
20d70 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
20d80 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
20d90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
20da0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
20db0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20dc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20dd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
20de0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
20df0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
20e00 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
20e10 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
20e20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
20e30 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
20e40 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
20e50 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
20e60 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
20e70 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
20e80 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
20e90 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
20ea0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
20eb0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
20ec0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
20ed0 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
20ee0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20ef0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
20f00 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
20f10 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
20f20 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
20f30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20f40 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
20f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
20f60 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
20f70 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
20f80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
20f90 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
20fa0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
20fb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
20fc0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
20fd0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
20fe0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
20ff0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21000 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
21010 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
21020 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
21030 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
21040 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
21050 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
21060 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
21070 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
21080 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
21090 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
210a0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
210b0 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
210c0 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
210d0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
210e0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
210f0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
21100 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
21110 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
21120 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
21130 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
21140 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
21150 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
21160 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
21170 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
21180 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
21190 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
211a0 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
211b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
211c0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
211d0 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
211e0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
211f0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
21200 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
21210 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
21220 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
21230 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
21240 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
21250 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
21260 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
21270 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
21280 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73       /* nOvfl is
21290 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65   always positive
212a0 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a 65  .  If it were ze
212b0 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64  ro, fetchPayload
212c0 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20   would have.    
212d0 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69    ** been used i
212e0 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72  nstead of this r
212f0 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20  outine. */.     
21300 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66   if( ALWAYS(nOvf
21310 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  l) && !pCur->aOv
21320 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
21330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21340 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
21350 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
21360 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
21370 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
21380 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
21390 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
213a0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
213b0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
213c0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
213d0 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
213e0 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
213f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
21400 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
21410 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21420 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
21430 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
21440 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
21450 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
21460 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
21470 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
21480 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
21490 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
214a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
214b0 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
214c0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
214d0 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
214e0 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  +){..#ifndef SQL
214f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
21500 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  B.      /* If re
21510 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
21520 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
21530 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
21540 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
21550 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
21560 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
21570 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21580 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
21590 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
215a0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
215b0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
215c0 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
215d0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ge;.      }.#end
215e0 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66  if..      if( of
215f0 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
21600 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
21610 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
21620 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
21630 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
21640 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
21650 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
21660 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
21670 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
21680 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
21690 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
216a0 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
216b0 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
216c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
216d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
216e0 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
216f0 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
21700 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
21710 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
21720 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
21730 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65         */.#ifnde
21740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
21750 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69  CRBLOB.        i
21760 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
21770 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
21780 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
21790 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
217a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
217b0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
217c0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23         } else .#
217d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
217e0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
217f0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
21800 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
21810 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
21820 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20  t -= ovflSize;. 
21830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21840 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72      /* Need to r
21850 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72  ead this page pr
21860 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61  operly. It conta
21870 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a  ins some of the.
21880 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65          ** range
21890 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73   of data that is
218a0 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70   being read (eOp
218b0 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20  ==0) or written 
218c0 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20  (eOp!=0)..      
218d0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
218e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
218f0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
21900 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21910 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
21920 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
21930 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
21940 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
21950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
21960 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
21970 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
21980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
21990 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
219a0 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
219b0 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
219c0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
219d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
219e0 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
219f0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
21a00 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
21a10 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
21a20 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
21a30 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
21a40 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
21a50 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
21a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
21a70 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
21a80 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
21a90 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70  ) there is no op
21aa0 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  en write-transac
21ab0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20  tion, and.      
21ac0 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61    **   5) the da
21ad0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20  tabase is not a 
21ae0 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20  WAL database,.  
21af0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
21b00 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
21b10 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
21b20 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
21b30 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
21b40 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
21b50 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
21b60 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
21b70 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
21b80 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
21b90 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
21ba0 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
21bb0 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
21bc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
21bd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21be0 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
21bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
21c20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
21c30 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c60 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
21c70 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
21c80 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21c90 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21cb0 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
21cc0 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
21cd0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
21ce0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
21cf0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
21d00 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
21d10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
21d20 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d40 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
21d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
21d60 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
21d70 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
21d80 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
21d90 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
21da0 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
21db0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21dc0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
21dd0 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
21de0 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
21df0 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
21e00 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
21e10 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
21e20 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
21e30 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
21e40 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
21e50 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
21e60 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
21e70 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
21e80 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
21e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21ea0 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
21eb0 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
21ec0 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
21ed0 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
21ee0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
21ef0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
21f00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21f30 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
21f40 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
21f50 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
21f60 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21f70 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
21f80 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
21f90 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
21fa0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
21fb0 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
21fc0 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
21fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21fe0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21ff0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22000 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
22010 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
22030 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
22040 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
22050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
22060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22070 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
22080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22090 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
220a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
220b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
220c0 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
220d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
220e0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
220f0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
22100 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
22110 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
22120 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
22130 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
22140 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
22150 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
22160 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
22170 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
22180 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
22190 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
221a0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
221b0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
221c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
221d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
221e0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
221f0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
22200 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
22210 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
22220 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
22230 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
22240 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
22250 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22260 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
22270 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
22280 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22290 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
222a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
222b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
222c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
222d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
222e0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
222f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22300 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
22310 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22320 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
22330 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22340 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
22350 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
22360 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
22370 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
22380 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
22390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
223a0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
223b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
223c0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
223d0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
223e0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
223f0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
22400 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
22410 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
22420 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
22430 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22440 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
22450 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
22460 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
22470 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
22480 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
22490 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
224a0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
224b0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
224c0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
224d0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
224e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
224f0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
22500 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
22510 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
22520 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22530 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
22540 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22550 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
22560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22570 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
22580 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
22590 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
225a0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
225b0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
225c0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
225d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
225e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
225f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22600 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22610 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22620 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
22630 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22640 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
22650 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22670 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22680 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22690 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
226a0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
226b0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
226c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
226d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
226e0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
226f0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
22700 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
22710 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
22720 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
22730 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
22740 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
22750 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
22760 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
22770 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
22780 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
22790 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
227a0 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
227b0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
227c0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
227d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
227e0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
227f0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
22800 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
22810 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
22820 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
22830 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
22840 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
22850 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
22860 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
22870 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
22880 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
22890 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
228a0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
228b0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
228c0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
228d0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
228e0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
228f0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
22900 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
22910 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
22920 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
22930 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
22940 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
22950 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
22960 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
22970 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
22980 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
22990 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
229a0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
229b0 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
229c0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
229d0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
229e0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
229f0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
22a00 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
22a10 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
22a20 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
22a30 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
22a40 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
22a50 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
22a60 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
22a70 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
22a80 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
22a90 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
22aa0 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
22ab0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
22ac0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22ad0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
22ae0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
22af0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
22b00 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
22b10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22b20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
22b30 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
22b40 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ere */.){.  asse
22b50 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
22b60 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
22b70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22b80 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
22b90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22ba0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22bb0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
22bc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22bd0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
22be0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
22bf0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22c00 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22c10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22c20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22c30 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
22c40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22c50 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70  nCell );.  if( p
22c60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
22c70 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
22c80 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
22c90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22ca0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
22cb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
22ce0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75   }.  *pAmt = pCu
22cf0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
22d00 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
22d10 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c  (pCur->info.pCel
22d20 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
22d30 48 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Header);.}.../*.
22d40 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
22d50 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
22d60 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
22d70 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
22d80 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
22d90 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
22da0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
22db0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
22dc0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
22dd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22de0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
22df0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
22e00 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
22e10 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
22e20 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
22e30 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
22e40 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
22e50 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
22e60 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
22e70 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
22e80 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
22e90 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
22ea0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
22eb0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
22ec0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
22ed0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
22ee0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
22ef0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
22f00 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
22f10 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
22f20 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
22f30 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
22f40 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
22f50 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
22f60 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
22f70 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
22f80 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
22f90 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
22fa0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22fb0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
22fc0 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
22fd0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
22fe0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
22ff0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
23000 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
23010 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
23020 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
23030 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
23040 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
23050 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
23060 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
23070 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
23080 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
23090 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
230a0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
230b0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
230c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
230d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
230e0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
230f0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
23100 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
23110 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
23120 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
23130 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
23140 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
23150 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
23160 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
23170 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
23180 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
23190 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
231a0 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
231b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
231c0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
231d0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
231e0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
231f0 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
23200 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
23210 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
23220 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
23230 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
23240 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23250 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23260 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23270 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23280 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23290 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
232a0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
232b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
232c0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
232d0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
232e0 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
232f0 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
23300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23310 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
23320 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
23330 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
23340 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20  o, &pNewPage,.  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
23360 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 3f 20 50  r->wrFlag==0 ? P
23370 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
23380 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63  Y : 0);.  if( rc
23390 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
233a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
233b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
233c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
233d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
233e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
233f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23400 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23410 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
23420 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
23430 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
23440 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
23450 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
23460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23470 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23480 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23490 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a  TE_OK;.}..#if 0.
234a0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
234b0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
234c0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
234d0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
234e0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
234f0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
23500 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
23510 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
23520 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
23530 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
23540 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
23550 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
23560 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
23570 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
23580 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
23590 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
235a0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
235b0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
235c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
235d0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
235e0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
235f0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
23600 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
23610 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
23620 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
23630 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
23640 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
23650 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
23660 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
23670 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
23680 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
23690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
236a0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
236b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
236c0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
236d0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
236e0 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
236f0 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
23700 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
23710 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23720 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
23730 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
23740 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
23750 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
23760 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
23770 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
23780 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
23790 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
237a0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
237b0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
237c0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
237d0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
237e0 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
237f0 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
23800 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
23810 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
23820 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
23830 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23840 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23850 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23860 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23870 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23880 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23890 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
238a0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
238b0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
238c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
238d0 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74  .  /* UPDATE: It
238e0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
238f0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f  sible for the co
23900 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62  ndition tested b
23910 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a  y the assert.  *
23920 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e  * below to be un
23930 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
23940 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
23950 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f  rupt. This can o
23960 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65  ccur if.  ** one
23970 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69   cursor has modi
23980 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e  fied page pParen
23990 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65  t while a refere
239a0 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c  nce to it is hel
239b0 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63  d .  ** by a sec
239c0 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63  ond cursor. Whic
239d0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
239e0 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  n if a single pa
239f0 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a  ge is linked.  *
23a00 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  * into more than
23a10 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
23a20 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75  cture in a corru
23a30 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  pt database.  */
23a40 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50  .#if 0.  assertP
23a50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
23a60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23a70 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23a80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23a90 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
23aa0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
23ab0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
23ac0 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  no.  );.#endif. 
23ad0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
23ae0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23af0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
23b00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23b10 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  -1]->nCell );.. 
23b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23b30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23b40 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
23b50 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
23b60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23b70 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23b80 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
23b90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23ba0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
23bb0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
23bc0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
23bd0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
23be0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
23bf0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
23c00 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23c10 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
23c20 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
23c30 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
23c40 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
23c50 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
23c60 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
23c70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23c80 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
23c90 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
23ca0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
23cb0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
23cc0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
23cd0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23ce0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
23cf0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
23d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
23d10 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
23d20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
23d30 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
23d40 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
23d50 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
23d60 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
23d70 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
23d80 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
23d90 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
23da0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
23db0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
23dc0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
23dd0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
23de0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
23df0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
23e00 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
23e10 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
23e20 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
23e30 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
23e40 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
23e50 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
23e60 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
23e70 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
23e80 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
23e90 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
23ea0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
23eb0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
23ec0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
23ed0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
23ee0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
23ef0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
23f00 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
23f10 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
23f20 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
23f30 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
23f40 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
23f50 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
23f60 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
23f70 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
23f80 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
23f90 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
23fa0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
23fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
23fc0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
23fd0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
23fe0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
23ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24000 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24010 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24020 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
24030 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
24040 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
24050 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
24060 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
24070 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
24080 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
24090 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
240a0 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
240b0 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
240c0 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
240d0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
240e0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
240f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
24100 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
24110 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
24120 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
24130 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24140 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
24150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24160 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
24170 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
24180 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
24190 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
241a0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72   pCur->iPage ) r
241b0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
241c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
241d0 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65  age--]);.  }else
241e0 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
241f0 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
24200 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
24210 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
24220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24230 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
24240 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
24250 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
24260 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
24270 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
24280 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30   pCur->wrFlag==0
242b0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
242c0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
242d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
242e0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
242f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24300 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
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 0a 20 20 70 52 6f 6f   = 0;.  }.  pRoo
24340 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
24350 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
24360 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
24370 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
24380 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
24390 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
243a0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
243b0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
243c0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
243d0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
243e0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
243f0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
24400 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
24410 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
24420 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
24430 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
24440 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24450 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
24460 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24470 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
24480 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
24490 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
244a0 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
244b0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
244c0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
244d0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
244e0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
244f0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
24500 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
24510 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
24520 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
24530 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
24540 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
24550 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
24560 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
24570 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
24580 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
24590 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
245a0 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
245b0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
245c0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
245d0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
245e0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
245f0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
24600 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
24610 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
24620 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
24630 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
24640 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24650 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
24660 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
24670 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
24680 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
24690 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
246a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
246b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f   = 0;..  if( pRo
246c0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
246d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
246e0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
246f0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
24700 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
24710 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
24720 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
24730 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
24740 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24750 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
24760 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
24770 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
24780 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
24790 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
247a0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
247b0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
247c0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
247d0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
247e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
247f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
24800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24820 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24830 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
24840 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24850 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
24860 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24870 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24880 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
24890 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
248a0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
248b0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
248c0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
248d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
248e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
248f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
24900 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24910 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24930 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24940 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
24950 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24960 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24970 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24980 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24990 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
249a0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
249b0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
249c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
249d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
249e0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
249f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
24a00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
24a10 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
24a20 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
24a30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24a40 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
24a50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24a60 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
24a70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24a80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
24a90 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
24aa0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24ab0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24ac0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
24ad0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
24ae0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24af0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
24b00 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
24b10 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
24b20 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
24b30 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
24b40 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
24b50 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
24b60 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
24b70 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
24b80 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
24b90 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
24ba0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
24bb0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24bc0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
24bd0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
24be0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
24bf0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
24c00 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
24c10 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
24c20 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
24c30 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
24c40 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
24c50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
24c60 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
24c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24c80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24c90 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
24ca0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24cb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24cc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24cd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24ce0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
24d00 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24d10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
24d20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
24d30 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
24d40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
24d50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24d60 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
24d70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24d80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
24d90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24da0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24db0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
24dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
24dd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24de0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
24df0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
24e00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
24e10 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
24e20 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
24e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24e40 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
24e50 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
24e60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
24e70 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
24e80 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
24e90 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
24ea0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
24eb0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
24ec0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
24ed0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
24ee0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
24ef0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
24f00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24f10 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
24f20 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
24f30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
24f40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24f50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24f60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24f70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
24f80 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
24f90 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
24fa0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24fb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24fd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24fe0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
24ff0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25000 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25010 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25020 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25030 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
25040 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
25050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25060 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
25070 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25080 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
25090 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
250a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
250b0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
250c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
250d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
250e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
250f0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
25100 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
25110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
25120 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
25130 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
25140 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
25150 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
25160 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
25170 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
25180 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25190 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
251a0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
251b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
251c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
251d0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
251e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
251f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25200 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25210 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25220 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
25240 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
25250 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
25260 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
25270 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
25280 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
25290 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
252a0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
252b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
252c0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
252d0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
252e0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
252f0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
25300 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
25310 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25320 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
25330 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
25340 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
25350 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
25360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
25370 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25380 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
25390 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
253a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
253b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
253c0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
253d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
253e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
253f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
25400 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25410 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
25420 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
25430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25440 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
25450 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
25460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25470 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
25480 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25490 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
254a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
254b0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
254c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
254d0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
254e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
254f0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
25500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25510 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25520 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
25530 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25540 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
25550 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
25560 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
25570 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
25580 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
25590 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
255a0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
255b0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
255c0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
255d0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
255e0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
255f0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
25600 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
25610 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
25620 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
25630 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
25640 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
25650 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
25660 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
25670 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
25680 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
25690 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
256a0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
256b0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
256c0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
256d0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
256e0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
256f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25700 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
25710 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
25720 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
25730 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
25740 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
25750 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
25760 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
25770 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
25780 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
25790 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
257a0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
257b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
257c0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
257d0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
257e0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
257f0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
25800 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
25810 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
25820 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
25830 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
25840 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
25850 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
25860 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
25870 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25880 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25890 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
258a0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
258b0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
258c0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
258d0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
258e0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
258f0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
25900 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
25910 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
25920 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
25930 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
25940 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25950 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25960 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
25990 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
259a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
259b0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
259c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
259d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
259e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
259f0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
25a00 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25a10 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
25a20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
25a30 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
25a40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25a60 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
25a70 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
25a80 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
25a90 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
25aa0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
25ab0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
25ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
25ad0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
25ae0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
25af0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
25b00 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
25b10 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
25b20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b40 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
25b50 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
25b60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25b70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25b80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25ba0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25bb0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25bc0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
25bd0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
25be0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
25bf0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
25c00 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
25c10 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
25c20 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
25c30 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
25c40 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
25c50 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
25c60 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
25c70 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
25c80 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
25c90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25ca0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
25cb0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
25cc0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
25cd0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
25ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
25cf0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
25d00 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
25d10 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
25d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25d30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
25d40 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
25d50 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
25d60 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
25d70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
25d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
25da0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
25db0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
25dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25dd0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25de0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25df0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25e00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
25e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25e20 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25e30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25e40 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
25e50 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25e60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25e70 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
25e80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25e90 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
25ea0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
25eb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25ec0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
25ed0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
25ee0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25ef0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25f00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25f10 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
25f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25f30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
25f40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25f50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
25f60 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
25f70 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
25f80 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
25f90 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
25fa0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
25fb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25fc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25fd0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
25fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
26000 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
26010 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
26020 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
26030 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
26040 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
26050 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
26060 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
26070 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
26080 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
26090 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
260a0 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
260b0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
260c0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
260d0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
260e0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
260f0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
26100 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
26110 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
26120 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
26130 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
26140 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
26150 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
26160 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
26170 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
26180 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
26190 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
261a0 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
261b0 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
261c0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
261d0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
261e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
261f0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
26200 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
26210 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
26220 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
26230 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
26240 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
26250 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
26260 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
26270 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
26280 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
26290 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
262a0 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
262b0 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
262c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
262d0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
262e0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
262f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
26300 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
26310 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
26320 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
26330 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
26340 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
26350 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
26360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
26370 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
26380 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
26390 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
263a0 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
263b0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
263c0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
263d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
263e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
263f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26400 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
26410 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
26420 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
26430 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
26440 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
26450 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26460 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
26470 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
26480 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
26490 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
264a0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
264b0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
264c0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
264d0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
264e0 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
264f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
26500 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26510 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
26520 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
26530 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26540 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  y = 1;.         
26550 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26560 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
26570 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
26580 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26590 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
265a0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
265b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
265c0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
265d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
265e0 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
265f0 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
26600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26610 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26620 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26630 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
26640 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26650 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
26680 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
26690 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
266a0 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
266b0 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
266c0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
266d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
266e0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
266f0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   nCell;.        
26700 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
26710 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
26720 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26730 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ze;..        /* 
26740 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
26750 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
26760 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
26770 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
26780 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
26790 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
267a0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
267b0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
267c0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
267d0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
267e0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
267f0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
26800 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
26810 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
26820 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
26830 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
26840 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
26850 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
26860 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
26870 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
26880 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
26890 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
268a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
268b0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
268c0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
268d0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
268e0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
268f0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
26900 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
26910 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26920 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
26930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26940 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
26950 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
26960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
26970 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
26980 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
26990 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
269a0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
269b0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
269c0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
269d0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
269e0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
269f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
26a00 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
26a10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26a20 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
26a30 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
26a40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
26a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
26a60 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26a70 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
26a80 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
26a90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26aa0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
26ab0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
26ac0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
26ad0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
26ae0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
26af0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
26b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26b10 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
26b20 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
26b30 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
26b40 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
26b50 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
26b60 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
26b70 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
26b80 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
26b90 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
26ba0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
26bb0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
26bc0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
26bd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
26be0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
26bf0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
26c00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26c10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26c20 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
26c30 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
26c40 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26c50 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
26c60 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
26c70 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
26c80 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
26c90 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
26ca0 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
26cb0 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
26cc0 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
26cd0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
26ce0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
26cf0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
26d00 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
26d10 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
26d20 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
26d30 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
26d40 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
26d50 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
26d60 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
26d70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26d80 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
26d90 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
26da0 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
26db0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
26dc0 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
26dd0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
26de0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
26df0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
26e00 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
26e10 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
26e20 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
26e30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
26e40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26e60 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
26e70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26e80 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
26e90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
26ea0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
26eb0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
26ec0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
26ed0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
26ee0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
26ef0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
26f00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26f20 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
26f30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26f40 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
26f50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26f60 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
26f70 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26f80 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
26f90 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
26fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26fb0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
26fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26fd0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
26fe0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26ff0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
27000 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
27010 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
27020 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
27030 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27040 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
27050 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27060 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27080 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
27090 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
270a0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
270b0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
270c0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
270d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
270e0 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
270f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
27100 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
27110 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
27120 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
27130 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
27140 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
27150 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
27160 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
27170 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
27180 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
27190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
271a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
271b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
271c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
271d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
271e0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
271f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27200 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
27210 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27220 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
27230 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
27240 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
27250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27260 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27270 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
27280 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
27290 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
272a0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
272b0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
272c0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
272d0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
272e0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
272f0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
27300 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
27310 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
27320 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
27330 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27340 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
27350 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
27360 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
27370 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
27380 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
27390 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
273a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
273b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
273c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 72  lidNKey = 0;.  r
273d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
273e0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
273f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
27400 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
27410 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
27420 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
27430 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
27440 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
27450 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
27460 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
27470 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
27480 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
27490 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
274a0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
274b0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
274c0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
274d0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
274e0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
274f0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27500 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
27510 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
27520 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
27530 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
27540 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27550 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
27560 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
27570 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
27580 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
27590 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
275a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
275b0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
275c0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
275d0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
275e0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
275f0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
27600 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
27610 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
27620 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
27630 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
27640 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27650 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
27660 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
27670 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
27680 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
27690 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
276a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
276b0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
276c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
276d0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
276e0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
276f0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
27700 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
27710 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
27720 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
27730 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
27740 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
27750 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
27760 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
27770 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
27780 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
27790 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
277a0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
277b0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
277c0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
277d0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
277e0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
277f0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
27800 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
27810 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
27820 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
27830 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
27840 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
27850 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
27860 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
27870 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
27880 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
27890 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
278a0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
278b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
278c0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
278d0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
278e0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
278f0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
27900 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
27910 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ver.).*/.int sql
27920 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
27930 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
27940 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
27950 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
27960 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
27970 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
27980 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27990 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
279a0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
279b0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
279c0 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
279d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
279e0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
279f0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
27a00 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
27a10 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
27a20 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
27a30 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
27a40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
27a50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
27a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27a70 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27a80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27a90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
27aa0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
27ab0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
27ac0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27ae0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
27af0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
27b00 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
27b10 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27b20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
27b30 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
27b40 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
27b50 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
27b60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
27b70 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
27b80 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
27b90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
27ba0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
27bb0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
27bc0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
27bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
27be0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
27bf0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
27c00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
27c10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27c20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27c30 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
27c40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27c50 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
27c60 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
27c70 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
27c80 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
27c90 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
27ca0 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
27cb0 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
27cc0 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
27cd0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
27ce0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
27cf0 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
27d00 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
27d10 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
27d20 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
27d30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
27d40 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
27d50 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
27d60 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
27d70 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
27d80 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
27d90 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
27da0 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
27db0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
27dc0 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
27dd0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
27de0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
27df0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
27e00 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
27e10 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
27e20 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
27e30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
27e40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
27e50 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
27e60 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
27e70 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
27e80 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
27e90 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
27ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
27eb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
27ec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27ed0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  }.      rc = mov
27ee0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
27ef0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
27f00 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
27f10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
27f20 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
27f30 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
27f40 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
27f50 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
27f60 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
27f70 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
27f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27f90 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
27fa0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
27fb0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
27fc0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27fd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27fe0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
27ff0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28000 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
28010 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
28020 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
28030 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
28050 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
28060 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
28070 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28080 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
280a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
280b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
280c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
280d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
280e0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
280f0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
28100 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
28110 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
28120 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
28130 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
28140 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28150 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
28160 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
28170 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
28180 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
28190 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
281a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
281b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
281c0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
281d0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
281e0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
281f0 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  s=1..**.** The c
28200 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
28210 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
28220 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
28230 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
28240 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
28250 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
28260 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
28270 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
28280 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
28290 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
282a0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
282b0 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
282c0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
282d0 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
282e0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
282f0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
28300 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
28310 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
28320 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
28330 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
28340 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
28350 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
28360 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
28370 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
28380 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
28390 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
283a0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
283b0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
283c0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
283d0 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
283e0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
283f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28400 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
28410 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
28420 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28430 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
28440 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
28450 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
28460 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28470 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28480 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28490 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
284a0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
284b0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
284c0 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
284d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
284e0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
284f0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
28500 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
28510 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
28520 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28530 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
28540 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  ){.    if( ALWAY
28550 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  S(pCur->eState>=
28560 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28570 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EK) ){.      rc 
28580 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
28590 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
285a0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
285b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
285c0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
285d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
285e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
285f0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
28600 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
28610 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
28620 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
28630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28640 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
28650 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
28660 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
28670 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28680 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
28690 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
286a0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
286b0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
286c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
286d0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
286e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
286f0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
28700 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
28710 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28720 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28730 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28740 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
28750 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
28760 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
28770 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28780 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28790 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
287a0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
287b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
287c0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
287d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
287e0 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
287f0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28800 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
28810 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
28820 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28830 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
28860 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28870 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
28880 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
28890 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
288a0 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
288b0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
288c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
288d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
288e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
288f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
28900 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28920 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
28930 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
28940 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
28950 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
28960 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
28970 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
28980 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28990 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
289a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
289b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
289c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
289d0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
289e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
289f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
28a00 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
28a10 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
28a20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28a30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
28a40 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
28a50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28a60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28a70 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
28a80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28a90 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
28aa0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
28ab0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
28ac0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
28ad0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
28ae0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
28af0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
28b00 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
28b10 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
28b20 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
28b30 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
28b40 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
28b50 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
28b60 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
28b70 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
28b80 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
28b90 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
28ba0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
28bb0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
28bc0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
28bd0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
28be0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
28bf0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
28c00 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
28c10 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
28c20 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
28c30 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
28c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28c50 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
28c60 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
28c70 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
28c80 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
28c90 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
28ca0 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
28cb0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
28cc0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
28cd0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
28ce0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
28cf0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
28d00 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
28d10 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
28d20 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
28d30 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
28d40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28d50 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
28d60 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
28d70 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
28d80 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
28d90 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
28da0 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
28db0 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
28dc0 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
28dd0 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
28de0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
28df0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
28e00 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
28e10 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
28e20 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
28e30 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
28e40 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
28e50 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
28e60 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
28e70 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
28e80 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
28e90 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
28ea0 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
28eb0 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
28ec0 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
28ed0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28ee0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
28ef0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
28f00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
28f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
28f20 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
28f30 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
28f40 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
28f50 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
28f60 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
28f70 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
28f80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
28f90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28fa0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
28fb0 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
28fc0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
28fd0 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
28fe0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
28ff0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
29000 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
29010 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
29020 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
29030 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
29040 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
29050 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
29060 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
29070 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
29080 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
29090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
290a0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
290b0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
290c0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
290d0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
290e0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
290f0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
29100 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
29110 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
29120 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29130 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29140 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
29150 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
29160 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
29170 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
29180 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
29190 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
291a0 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
291b0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
291c0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
291d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
291e0 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
291f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
29200 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
29210 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
29220 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
29230 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
29240 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29250 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
29260 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
29270 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
29280 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
29290 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
292a0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
292b0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
292c0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
292d0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
292e0 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
292f0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
29300 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
29310 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
29320 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
29330 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
29340 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
29350 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
29360 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
29370 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
29380 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
29390 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
293a0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
293b0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
293c0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
293d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
293e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
293f0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
29400 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
29410 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
29420 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
29430 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
29440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
29450 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
29460 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
29470 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
29480 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29490 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
294a0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
294b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
294c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
294d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
294e0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
294f0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
29500 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
29510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29520 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
29530 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
29540 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
29550 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
29560 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
29570 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
29580 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
29590 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
295a0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
295b0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
295c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
295d0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
295e0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
295f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
29600 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29610 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
29620 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29630 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
29640 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29650 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
29660 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
29670 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
29680 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
29690 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
296a0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
296b0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
296c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
296d0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
296e0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
296f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
29700 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
29710 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
29720 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
29730 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
29740 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
29750 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
29760 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
29770 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
29780 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
29790 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
297a0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
297b0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
297c0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
297d0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
297e0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
297f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
29800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29810 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29820 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29830 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
29840 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
29850 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
29860 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
29870 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
29880 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29890 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
298a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
298b0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
298c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
298d0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
298e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
298f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29900 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
29910 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29920 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29930 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29940 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
29950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29960 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
29970 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
29980 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
29990 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
299a0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
299b0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
299c0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
299d0 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
299e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
299f0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
29a00 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
29a10 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
29a20 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
29a30 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
29a40 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
29a50 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
29a60 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
29a70 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
29a80 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
29a90 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
29aa0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
29ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29ac0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
29ad0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
29ae0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29af0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
29b00 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29b10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29b20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
29b30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
29b40 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29b50 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29b60 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29b70 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29b80 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29b90 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
29ba0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
29bb0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
29bc0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
29bd0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
29be0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
29bf0 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
29c00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
29c10 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
29c20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
29c30 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
29c40 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29c50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
29c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29c70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29c80 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29c90 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
29ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29cb0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
29cc0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
29cd0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
29ce0 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
29cf0 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
29d00 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
29d10 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
29d20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
29d30 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
29d40 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
29d50 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
29d60 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
29d70 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
29d80 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
29d90 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
29da0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
29db0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
29dc0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
29dd0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29de0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29df0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
29e00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29e10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29e20 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
29e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29e50 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29e60 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
29e70 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
29e80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29e90 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29eb0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29ec0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29ed0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29ee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29ef0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29f00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29f10 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
29f20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29f50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29f60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29f70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29f80 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29f90 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
29fa0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
29fb0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29fe0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
29ff0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
2a000 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
2a010 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
2a020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
2a030 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
2a040 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
2a050 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
2a060 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
2a070 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2a080 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
2a090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a0a0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
2a0b0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
2a0c0 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
2a0d0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2a0e0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
2a0f0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
2a100 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
2a110 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2a120 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a130 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2a140 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a150 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a170 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
2a180 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2a190 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2a1a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2a1b0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
2a1c0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2a1d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a1e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a1f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a200 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a230 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
2a240 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a270 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2a280 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
2a290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2a2a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a2b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2a2c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
2a2d0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2a2e0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2a2f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2a300 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2a310 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
2a320 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
2a330 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a340 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
2a350 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
2a360 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
2a370 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
2a380 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
2a390 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2a3a0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2a3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a3c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2a3d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a3e0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2a3f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2a400 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a410 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
2a420 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2a430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a450 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2a460 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2a470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a480 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2a490 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a4a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a4b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a4c0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a4d0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2a4e0 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
2a4f0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2a500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a510 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2a520 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2a530 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2a540 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2a550 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2a560 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
2a570 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a580 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
2a590 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
2a5a0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
2a5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
2a5c0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
2a5d0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
2a5e0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
2a5f0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
2a600 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
2a610 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
2a620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
2a630 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
2a640 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2a650 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
2a660 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2a670 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2a680 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
2a690 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
2a6a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2a6b0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
2a6c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a6d0 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2a710 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2a720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a730 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
2a740 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
2a750 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
2a760 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
2a770 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
2a780 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
2a790 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2a7a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2a7b0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
2a7c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
2a7d0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2a7e0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2a7f0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
2a800 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
2a810 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
2a820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a830 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2a850 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
2a860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a880 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2a890 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
2a8a0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2a8b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
2a8c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2a8d0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
2a8e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
2a8f0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2a900 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2a910 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
2a920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2a930 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a940 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2a950 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a960 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a970 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2a980 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2a990 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2a9a0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
2a9b0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
2a9c0 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
2a9d0 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
2a9e0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2a9f0 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
2aa00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
2aa10 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
2aa20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
2aa30 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
2aa40 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2aa50 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
2aa60 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa80 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
2aa90 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
2aaa0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
2aab0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
2aac0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
2aad0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
2aae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2aaf0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2ab00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2ab10 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ab20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ab30 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
2ab40 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
2ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2ab60 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
2ab70 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
2ab80 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
2ab90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aba0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
2abb0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
2abc0 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
2abd0 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
2abe0 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
2abf0 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  o) ? PAGER_GET_N
2ac00 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2ac10 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2ac20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2ac30 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2ac40 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2ac50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2ac60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ac70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ac80 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2ac90 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2aca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2acb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2acc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2acd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2ace0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2acf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ad00 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2ad10 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2ad20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ad30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ad40 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2ad50 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2ad60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2ad70 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2ad80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2ad90 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2ada0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2adb0 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2adc0 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2add0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2ade0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2adf0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2ae00 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2ae10 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2ae20 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2ae30 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2ae40 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2ae50 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2ae60 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2ae70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2ae80 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2ae90 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2aea0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2aeb0 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2aec0 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2aed0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2aee0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2aef0 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2af00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2af10 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2af20 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2af30 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2af40 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2af50 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2af60 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2af70 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2af80 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2af90 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2afa0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2afb0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2afc0 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2afd0 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2afe0 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2aff0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2b000 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2b010 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2b020 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2b030 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2b040 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2b050 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2b060 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2b070 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2b080 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2b090 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2b0a0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2b0b0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2b0c0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2b0d0 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2b0e0 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2b0f0 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2b100 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2b110 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2b120 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2b130 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2b140 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2b150 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2b160 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2b170 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2b180 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2b1a0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2b1b0 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2b1c0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2b1d0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   ? PAGER_GET_NOC
2b1e0 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20  ONTENT : 0;..   
2b1f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b200 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2b210 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2b220 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2b230 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2b240 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2b250 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2b260 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b270 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2b280 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2b290 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b2a0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2b2b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2b2c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2b2d0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2b2e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2b2f0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2b300 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2b310 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2b320 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2b330 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2b340 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2b350 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2b360 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2b370 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2b380 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2b390 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2b3a0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2b3b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2b3c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2b3d0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2b3e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b3f0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b400 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2b410 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2b420 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2b430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2b440 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2b450 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2b470 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b480 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2b490 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2b4a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b4d0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
2b4e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b4f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
2b500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b510 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b520 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
2b530 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
2b540 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2b550 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b560 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
2b570 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
2b580 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
2b590 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
2b5a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
2b5b0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
2b5c0 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
2b5d0 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
2b5e0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2b5f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b600 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
2b610 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b620 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2b630 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2b640 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b650 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2b660 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b670 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2b680 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2b690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b6a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b6b0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
2b6c0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b6d0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b6e0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
2b6f0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
2b700 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
2b710 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b720 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
2b730 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
2b740 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2b750 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
2b760 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2b770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b780 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
2b790 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2b7a0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
2b7b0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
2b7c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b7d0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2b7e0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2b7f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b800 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b810 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
2b820 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
2b830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
2b840 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
2b850 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2b860 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
2b870 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b880 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  le((*ppPage)->pD
2b890 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
2b8a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b8b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2b8c0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
2b8d0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
2b8e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
2b8f0 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
2b900 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
2b910 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2b920 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
2b930 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2b940 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
2b950 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2b960 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2b970 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b980 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
2b990 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
2b9a0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
2b9b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
2b9c0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
2b9d0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2b9e0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
2b9f0 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
2ba00 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
2ba10 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
2ba20 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
2ba30 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
2ba40 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
2ba50 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2ba60 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
2ba70 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2ba80 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
2ba90 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
2baa0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
2bab0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2bac0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
2bad0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
2bae0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
2baf0 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
2bb00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
2bb10 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2bb20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
2bb30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2bb40 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
2bb50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2bb60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2bb70 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
2bb80 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2bb90 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
2bba0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2bbb0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
2bbc0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
2bbd0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
2bbe0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc00 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
2bc10 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
2bc20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2bc50 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2bc60 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc80 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
2bc90 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2bca0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
2bcb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2bcc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2bcd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2bce0 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
2bcf0 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
2bd00 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
2bd10 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
2bd20 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
2bd30 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
2bd40 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
2bd50 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
2bd60 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
2bd70 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
2bd80 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2bd90 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
2bda0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
2bdb0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
2bdc0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
2bdd0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2bde0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2bdf0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2be00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2be10 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
2be20 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
2be30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2be40 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
2be50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2be60 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
2be70 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
2be80 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2be90 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
2bea0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
2beb0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
2bec0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
2bed0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
2bee0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
2bef0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
2bf00 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
2bf10 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
2bf20 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
2bf30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2bf40 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2bf50 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
2bf60 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
2bf70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bf80 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2bf90 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
2bfa0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2bfb0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2bfc0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
2bfd0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
2bfe0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
2bff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c000 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2c010 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2c020 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
2c030 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2c040 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
2c050 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
2c060 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
2c070 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2c080 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
2c090 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
2c0a0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2c0b0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
2c0c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2c0d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
2c0e0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
2c0f0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
2c100 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2c110 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
2c120 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
2c130 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
2c140 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2c150 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
2c160 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
2c170 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
2c180 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2c190 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
2c1a0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
2c1b0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
2c1c0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
2c1d0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
2c1e0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
2c1f0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
2c200 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
2c210 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
2c220 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
2c230 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
2c240 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
2c250 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2c260 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
2c270 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
2c280 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
2c290 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
2c2a0 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
2c2b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2c2c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
2c2d0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
2c2e0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
2c2f0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2c300 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2c310 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
2c320 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c330 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2c340 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
2c350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c360 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2c370 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
2c380 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
2c390 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2c3a0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
2c3b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2c3c0 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
2c3d0 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
2c3e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2c3f0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
2c400 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c410 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2c420 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c430 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
2c440 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
2c450 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c460 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2c470 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2c480 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
2c490 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
2c4a0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
2c4b0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
2c4c0 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
2c4d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c4e0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2c4f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
2c500 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
2c510 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
2c520 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2c530 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
2c540 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
2c550 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2c560 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
2c570 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
2c580 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
2c590 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
2c5a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
2c5b0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
2c5c0 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
2c5d0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
2c5e0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
2c5f0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
2c600 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2c610 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
2c620 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
2c630 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
2c640 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
2c650 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
2c660 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2c670 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
2c680 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
2c690 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
2c6a0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
2c6b0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
2c6c0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
2c6d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c6e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
2c6f0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
2c700 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
2c710 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
2c720 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
2c730 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
2c740 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
2c750 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
2c760 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
2c770 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
2c780 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
2c790 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
2c7a0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
2c7b0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
2c7c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c7d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2c7e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2c7f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c810 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2c820 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
2c830 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
2c840 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2c850 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
2c860 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
2c870 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
2c880 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
2c890 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2c8a0 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
2c8b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2c8c0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2c8d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2c8f0 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2c900 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2c910 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c920 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2c930 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2c940 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2c950 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2c960 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2c970 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2c980 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2c990 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2c9a0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2c9b0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2c9c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2c9d0 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2c9e0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2c9f0 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2ca00 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2ca10 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2ca20 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2ca30 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2ca40 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2ca50 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2ca60 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2ca70 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2ca80 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2ca90 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2caa0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2cab0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2cac0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2cad0 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2cae0 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2caf0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2cb00 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2cb10 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2cb20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2cb30 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2cb40 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
2cb50 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2cb60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2cb70 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2cb80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2cb90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cba0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2cbb0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
2cbc0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
2cbd0 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
2cbe0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2cbf0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
2cc00 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2cc10 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2cc20 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
2cc30 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
2cc40 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
2cc50 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
2cc60 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
2cc70 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
2cc80 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
2cc90 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
2cca0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
2ccb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ccc0 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
2ccd0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2cce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2ccf0 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
2cd00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2cd10 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2cd20 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2cd30 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
2cd40 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
2cd50 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
2cd60 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
2cd70 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
2cd80 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2cd90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2cda0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
2cdb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2cdc0 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
2cdd0 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
2cde0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
2cdf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ce00 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2ce10 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2ce20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
2ce30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2ce40 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
2ce50 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
2ce60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ce70 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2ce80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2ce90 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2cea0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2ceb0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
2cec0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
2ced0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cee0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
2cef0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2cf00 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2cf10 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
2cf20 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
2cf30 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
2cf40 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  +3 > pPage->aDat
2cf50 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
2cf60 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2cf70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2cf80 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  KPT;  /* Cell ex
2cf90 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2cfa0 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2cfb0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2cfc0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2cfd0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2cfe0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2cff0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2d000 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2d010 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2d020 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2d030 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2d040 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2d050 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2d060 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2d070 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2d080 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2d090 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2d0a0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2d0b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2d0c0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2d0d0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2d0e0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2d0f0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2d100 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2d110 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2d120 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2d130 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2d140 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2d150 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2d160 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2d170 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2d180 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2d190 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2d1a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2d1b0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2d1c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d1d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d1e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2d1f0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2d200 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2d210 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2d220 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2d230 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2d240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d250 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2d260 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2d270 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2d280 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2d290 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2d2a0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2d2b0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2d2c0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2d2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2d2e0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2d2f0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2d300 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2d310 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2d320 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2d330 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2d340 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2d350 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2d360 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2d370 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2d380 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2d390 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2d3a0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2d3b0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2d3c0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2d3d0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2d3e0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2d3f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2d400 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2d410 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2d420 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2d430 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2d440 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2d450 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2d460 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2d470 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2d480 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2d490 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2d4a0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2d4b0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2d4c0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2d4d0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2d4e0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2d4f0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2d500 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2d510 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2d520 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2d530 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2d540 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d560 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2d570 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2d580 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2d590 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2d5a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2d5b0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2d5c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d5d0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2d5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d5f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d600 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2d610 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2d620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d630 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2d640 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2d650 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2d660 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2d670 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2d680 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2d690 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2d6a0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2d6b0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2d6c0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2d6d0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2d6e0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2d6f0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2d700 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2d710 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2d720 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2d730 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2d740 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2d750 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2d760 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2d770 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2d780 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2d790 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2d7a0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2d7b0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2d7c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2d7d0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2d7e0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2d7f0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2d800 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2d810 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2d820 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2d830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d840 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2d850 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d870 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2d880 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2d890 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2d8a0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2d8b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2d8c0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2d8d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2d8e0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2d8f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2d900 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2d910 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2d920 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2d930 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d950 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2d960 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2d970 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2d980 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d9a0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2d9b0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2d9c0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2d9d0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2d9e0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2d9f0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2da00 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2da10 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2da20 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2da30 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2da40 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2da50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2da60 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2da70 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2da80 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2da90 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2daa0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2dab0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2dac0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2dad0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2dae0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2daf0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2db00 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2db10 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2db20 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2db30 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2db40 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2db50 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2db60 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2db70 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2db80 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2db90 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2dba0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2dbb0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2dbc0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2dbd0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2dbe0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2dbf0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2dc00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2dc10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2dc20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2dc30 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2dc40 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2dc50 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2dc60 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2dc70 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
2dc80 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2dc90 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2dca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2dcb0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2dcc0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2dcd0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2dce0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2dcf0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2dd00 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2dd10 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2dd20 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2dd30 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2dd40 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2dd50 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2dd60 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2dd70 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2dd80 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2dd90 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2dda0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2ddb0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2ddc0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2ddd0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2dde0 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2ddf0 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2de00 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2de10 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2de20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2de30 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2de40 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2de50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2de60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2de70 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2de80 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2de90 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2dea0 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2deb0 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2dec0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2ded0 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2dee0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2def0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2df00 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2df10 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2df20 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2df30 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2df40 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2df50 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2df60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2df70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2df80 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2df90 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2dfa0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2dfb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2dfc0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2dfd0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2dfe0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2dff0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2e000 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2e010 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2e020 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2e030 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2e040 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2e050 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e060 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2e070 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2e080 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2e090 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e0a0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2e0b0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2e0c0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2e0d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e0e0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2e0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2e100 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2e110 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2e120 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2e130 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2e140 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2e150 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2e160 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2e170 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2e180 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2e190 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2e1a0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2e1b0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2e1c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2e1d0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2e1e0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2e1f0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2e200 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2e210 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2e220 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2e230 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2e240 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2e250 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2e260 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2e270 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2e280 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2e290 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2e2a0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
2e2b0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2e2c0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2e2d0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2e2e0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2e2f0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2e300 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2e310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e320 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2e330 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2e340 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2e350 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2e360 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2e370 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2e380 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2e390 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2e3a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e3b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e3c0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2e3d0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2e3e0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2e3f0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2e400 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2e410 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2e420 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2e430 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2e440 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2e450 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2e460 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2e470 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2e480 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2e490 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2e4a0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2e4b0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2e4c0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2e4d0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2e4e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e4f0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2e500 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2e510 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2e520 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2e530 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2e540 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2e550 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2e560 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2e570 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2e580 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2e590 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2e5a0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2e5b0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2e5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2e5d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e5e0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e5f0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2e600 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2e610 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2e620 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e630 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2e640 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2e650 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2e660 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2e670 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2e680 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2e690 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2e6a0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2e6b0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2e6c0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2e6d0 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2e6e0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2e6f0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2e700 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2e710 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2e720 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2e730 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2e740 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2e750 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2e760 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2e770 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2e780 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2e790 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2e7a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2e7b0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2e7c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e7d0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2e7e0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2e7f0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2e800 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2e810 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2e820 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2e830 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2e840 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2e850 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2e860 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2e870 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2e880 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2e890 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2e8a0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2e8b0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2e8c0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e8d0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2e8e0 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2e8f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2e900 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2e910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2e920 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2e930 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2e940 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2e950 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2e960 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2e970 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2e980 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2e990 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2e9a0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2e9b0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2e9c0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2e9d0 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2e9e0 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2e9f0 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2ea00 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2ea10 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2ea20 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2ea30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ea40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2ea50 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2ea60 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2ea70 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2ea80 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2ea90 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2eaa0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2eab0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2eac0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2ead0 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2eae0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2eaf0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2eb00 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2eb10 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2eb20 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2eb30 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2eb40 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2eb50 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2eb60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2eb70 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2eb80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2eb90 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2eba0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2ebb0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2ebc0 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2ebd0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2ebe0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2ebf0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2ec00 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2ec10 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2ec20 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2ec30 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2ec40 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2ec50 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2ec60 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2ec70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2ec80 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2ec90 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2eca0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2ecb0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2ecc0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2ecd0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2ece0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2ecf0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2ed00 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2ed10 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2ed20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2ed30 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2ed40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ed50 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ed60 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2ed70 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2ed80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ed90 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2eda0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2edb0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2edc0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2edd0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2ede0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2edf0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2ee00 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2ee10 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2ee20 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2ee30 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2ee40 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2ee50 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2ee60 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2ee70 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2ee80 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2ee90 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2eea0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2eeb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2eec0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2eed0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2eee0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2eef0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2ef00 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2ef10 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2ef20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2ef30 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2ef40 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28  ll--;.  memmove(
2ef50 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
2ef60 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
2ef70 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  x));.  put2byte(
2ef80 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2ef90 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2efa0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2efb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2efc0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2efd0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2efe0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2eff0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2f000 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2f010 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2f020 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2f030 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2f040 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2f050 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2f060 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2f070 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2f080 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2f090 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2f0a0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2f0b0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2f0c0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2f0d0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2f0e0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2f0f0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
2f100 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2f110 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2f120 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2f130 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2f140 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2f150 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2f160 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2f170 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2f180 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2f190 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2f1a0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2f1b0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2f1c0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2f1d0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2f1e0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2f1f0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2f200 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2f210 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2f220 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2f230 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2f240 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2f250 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2f260 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f270 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2f280 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2f290 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2f2a0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2f2b0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2f2c0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2f2d0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2f2e0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2f2f0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2f300 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2f310 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2f320 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2f330 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2f340 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2f350 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2f360 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2f370 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2f380 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2f390 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2f3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2f3b0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2f3c0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2f3d0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2f3e0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2f3f0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2f400 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2f410 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2f420 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2f430 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2f440 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2f450 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2f460 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2f470 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2f480 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2f490 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2f4a0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
2f4b0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2f4c0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2f4d0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2f4e0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2f4f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2f500 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2f510 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2f520 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2f530 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2f540 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2f550 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2f560 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2f570 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2f580 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2f590 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2f5a0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2f5b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2f5c0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2f5d0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2f5e0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2f5f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2f600 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2f610 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  page */.  int nS
2f620 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2f630 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2f640 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2f650 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2f660 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2f670 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2f680 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2f690 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2f6a0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2f6b0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2f6c0 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2f6d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f6e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2f6f0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f700 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
2f710 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
2f720 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
2f730 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f740 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
2f750 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f760 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2f770 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2f780 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2f790 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2f7a0 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2f7b0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2f7c0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2f7d0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2f7e0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2f7f0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2f800 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2f810 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2f820 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2f830 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2f840 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2f850 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2f860 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2f870 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2f880 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2f890 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2f8a0 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2f8b0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2f8c0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2f8d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2f8e0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2f8f0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2f900 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2f910 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2f920 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2f930 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2f940 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2f950 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2f960 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2f970 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2f980 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2f990 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2f9a0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2f9b0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2f9c0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2f9d0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2f9e0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2f9f0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2fa00 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2fa10 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2fa20 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
2fa30 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2fa40 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
2fa50 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
2fa60 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
2fa70 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
2fa80 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
2fa90 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
2faa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fab0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2fac0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2fad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fae0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2faf0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2fb00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
2fb10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2fb20 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2fb30 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
2fb40 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2fb50 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
2fb60 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
2fb70 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
2fb80 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2fb90 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2fba0 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
2fbb0 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20  t + 2*i;.    rc 
2fbc0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
2fbd0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
2fbe0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
2fbf0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
2fc00 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
2fc10 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
2fc20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
2fc30 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2fc40 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a   two properties.
2fc50 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
2fc60 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a  urns success */.
2fc70 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
2fc80 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20  >= end+2 );.    
2fc90 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
2fca0 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
2fcb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2fcc0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
2fcd0 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
2fce0 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
2fcf0 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
2fd00 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
2fd10 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
2fd20 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2fd30 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2fd40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
2fd50 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
2fd60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  );.    }.    mem
2fd70 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32  move(&data[ins+2
2fd80 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65  ], &data[ins], e
2fd90 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74  nd-ins);.    put
2fda0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2fdb0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2fdc0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2fdd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2fde0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2fdf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fe00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fe10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2fe20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2fe30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2fe40 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2fe50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2fe60 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2fe70 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2fe80 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2fe90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2fea0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2feb0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2fec0 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2fed0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2fee0 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2fef0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2ff00 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2ff10 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2ff20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2ff30 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2ff40 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2ff50 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2ff60 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2ff70 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2ff80 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2ff90 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2ffa0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2ffb0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2ffc0 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2ffd0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2ffe0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2fff0 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
30000 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
30010 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
30020 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
30030 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
30040 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
30050 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
30060 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
30070 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
30080 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30090 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
300a0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
300b0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
300c0 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
300d0 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
300e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
300f0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
30100 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
30110 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
30120 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
30130 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
30140 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
30150 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
30160 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
30170 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
30180 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
30190 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
301a0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
301b0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
301c0 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
301d0 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
301e0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
301f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30200 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
30210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30220 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
30230 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
30240 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
30250 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
30260 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
30270 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
30280 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
30290 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
302a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
302b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
302c0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
302d0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
302e0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
302f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
30300 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
30310 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
30320 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
30330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
30340 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
30350 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
30360 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
30370 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
30380 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
30390 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
303a0 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
303b0 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
303c0 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
303d0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
303e0 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
303f0 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
30400 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
30410 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
30420 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
30430 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
30440 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
30450 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
30460 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
30470 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
30480 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
30490 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
304a0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
304b0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
304c0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
304d0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
304e0 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
304f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
30500 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
30510 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
30520 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
30530 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
30540 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
30550 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
30560 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
30570 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
30580 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
30590 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
305a0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
305b0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
305c0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
305d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
305e0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
305f0 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
30600 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
30610 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
30620 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
30630 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
30640 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
30650 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
30660 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
30670 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
30680 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
30690 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
306a0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
306b0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
306c0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
306d0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
306e0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
306f0 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
30700 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
30710 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
30720 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
30730 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
30740 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
30750 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
30760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30770 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
30780 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
30790 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
307a0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
307b0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
307c0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
307d0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
307e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
307f0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
30800 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
30810 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
30820 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
30830 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
30840 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
30850 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
30860 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
30870 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
30880 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
30890 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
308a0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
308b0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
308c0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
308d0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
308e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
308f0 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
30900 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
30910 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
30920 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
30930 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
30940 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
30950 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
30960 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
30970 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
30980 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
30990 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
309a0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
309b0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
309c0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
309d0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
309e0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
309f0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
30a00 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
30a10 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
30a20 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
30a30 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
30a40 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
30a50 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
30a60 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
30a70 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
30a80 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
30a90 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
30aa0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
30ab0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
30ac0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
30ad0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
30ae0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
30af0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
30b00 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
30b10 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
30b20 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
30b30 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
30b40 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
30b50 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
30b60 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
30b70 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
30b80 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
30b90 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
30ba0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
30bb0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
30bc0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30bd0 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
30be0 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
30bf0 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
30c00 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
30c10 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
30c20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
30c30 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
30c40 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
30c50 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
30c60 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
30c70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
30c80 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
30c90 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
30ca0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
30cb0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
30cc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
30cf0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
30d00 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30d30 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
30d40 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
30d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d60 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
30d70 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
30d80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30d90 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
30da0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
30db0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30dc0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30dd0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
30de0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
30df0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30e00 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
30e10 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
30e20 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
30e30 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
30e40 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
30e50 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
30e60 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  >nCell==0 ) retu
30e70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30e80 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
30e90 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30ea0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
30eb0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
30ec0 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
30ed0 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
30ee0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30ef0 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
30f00 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
30f10 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
30f20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
30f30 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
30f40 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
30f50 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
30f60 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
30f70 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
30f80 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
30f90 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
30fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30fb0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
30fc0 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
30fd0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
30fe0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  age->apOvfl[0];.
30ff0 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
31000 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
31010 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
31020 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
31030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31040 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31050 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
31060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31070 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
31080 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
31090 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
310a0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
310b0 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
310c0 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
310d0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
310e0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
310f0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
31100 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
31110 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
31120 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
31130 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
31140 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
31150 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
31160 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
31170 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
31180 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
31190 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
311a0 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
311b0 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
311c0 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
311d0 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
311e0 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
311f0 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
31200 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
31210 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
31220 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
31230 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
31240 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
31250 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
31260 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
31270 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
31280 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
31290 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
312a0 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
312b0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
312c0 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
312d0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
312e0 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
312f0 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
31300 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
31310 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
31320 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31330 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
31340 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
31350 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
31360 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
31370 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
31380 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
31390 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
313a0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
313b0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
313c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
313d0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
313e0 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
313f0 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
31400 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
31410 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
31420 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
31430 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
31440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31450 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
31460 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
31470 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
31480 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
31490 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
314a0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
314b0 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
314c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
314d0 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
314e0 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
314f0 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
31500 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
31510 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
31520 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
31530 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
31540 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
31550 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
31560 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
31570 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
31580 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
31590 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
315a0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
315b0 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
315c0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
315d0 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
315e0 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
315f0 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
31600 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
31610 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
31620 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
31630 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
31640 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
31650 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
31660 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
31670 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
31680 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
31690 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
316a0 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
316b0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
316c0 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
316d0 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
316e0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
316f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
31700 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
31710 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
31720 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
31730 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
31740 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
31750 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
31760 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
31770 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
31780 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
31790 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
317a0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
317b0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
317c0 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
317d0 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
317e0 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
31800 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
31810 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
31820 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
31830 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
31840 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
31850 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
31860 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31870 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
31880 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
31890 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
318a0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
318b0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
318c0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
318d0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
318e0 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
318f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
31900 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31910 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
31920 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
31930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
31940 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
31950 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
31960 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
31970 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
31980 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
31990 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
319a0 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
319b0 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
319c0 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
319d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
319e0 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
319f0 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
31a00 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
31a10 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
31a20 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
31a30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
31a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
31a50 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
31a60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31a70 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
31a80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
31a90 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
31aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31ab0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
31ac0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
31ad0 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
31ae0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
31af0 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
31b00 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
31b10 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31b20 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
31b30 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
31b40 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
31b50 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
31b60 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31b70 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
31b80 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
31b90 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
31ba0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
31bb0 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
31bc0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31bd0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
31be0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
31bf0 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
31c00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
31c10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31c20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
31c30 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
31c40 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
31c50 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31c60 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
31c70 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
31c80 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
31c90 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
31ca0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
31cb0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31cc0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
31cd0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
31ce0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31cf0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31d00 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
31d10 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31d20 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
31d30 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
31d40 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
31d50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
31d60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
31d70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
31d80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
31d90 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
31da0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
31db0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
31dc0 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
31dd0 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
31de0 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
31df0 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
31e00 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
31e10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
31e20 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
31e30 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
31e40 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
31e50 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
31e60 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
31e70 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
31e80 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
31e90 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
31ea0 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
31eb0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
31ec0 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
31ed0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
31ee0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
31ef0 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
31f00 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
31f10 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
31f20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
31f30 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
31f40 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
31f50 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
31f60 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
31f70 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f  e.** MemPage.apO
31f80 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
31f90 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
31fa0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
31fb0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
31fc0 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
31fd0 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
31fe0 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
31ff0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
32000 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
32010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
32020 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
32030 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
32040 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
32050 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
32060 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
32070 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
32080 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
32090 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
320a0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
320b0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
320c0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
320d0 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
320e0 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
320f0 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
32100 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
32110 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
32120 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
32130 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
32140 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
32150 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
32160 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
32170 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
32180 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
32190 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
321a0 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
321b0 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
321c0 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
321d0 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
321e0 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69   100 : 0);.    i
321f0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69  nt rc;.    int i
32200 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20  Data;.  .  .    
32210 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
32220 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73  sInit );.    ass
32230 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65  ert( pFrom->nFre
32240 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20  e>=iToHdr );.   
32250 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
32260 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
32270 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42  r+5]) <= (int)pB
32280 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
32290 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
322a0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
322b0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
322c0 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
322d0 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
322e0 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
322f0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
32300 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
32310 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
32320 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
32330 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
32340 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
32350 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
32360 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
32370 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
32380 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
32390 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
323a0 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
323b0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
323c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
323d0 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
323e0 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
323f0 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
32400 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
32410 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
32420 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
32430 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
32440 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
32450 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
32460 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
32470 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
32480 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
32490 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
324a0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
324b0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
324c0 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
324d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
324e0 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
324f0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
32500 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
32510 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
32520 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
32530 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
32540 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
32550 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
32560 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
32570 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
32580 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
32590 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
325a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
325b0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
325c0 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
325d0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
325e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
325f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
32600 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
32610 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
32620 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
32630 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
32640 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
32650 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
32660 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
32670 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
32680 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
32690 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
326a0 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
326b0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
326c0 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
326d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
326e0 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
326f0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
32700 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
32710 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
32720 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
32730 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
32740 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
32750 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
32760 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
32770 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
32780 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
32790 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
327a0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
327b0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
327c0 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
327d0 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
327e0 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
327f0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
32800 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
32810 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
32820 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
32830 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
32840 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
32850 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
32860 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
32870 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
32880 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
32890 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
328a0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
328b0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
328c0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
328d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
328e0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
328f0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
32900 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
32910 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
32920 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
32930 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
32940 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
32950 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
32960 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
32970 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
32980 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
32990 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
329a0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
329b0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
329c0 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
329d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
329e0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
329f0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
32a00 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
32a10 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
32a20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
32a30 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
32a40 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
32a50 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
32a60 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
32a70 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
32a80 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
32a90 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
32aa0 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
32ab0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
32ac0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
32ad0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
32ae0 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
32af0 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
32b00 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
32b10 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
32b20 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
32b30 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
32b40 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
32b50 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
32b60 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
32b70 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
32b80 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
32b90 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
32ba0 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
32bb0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
32bc0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
32bd0 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
32be0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
32bf0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
32c00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
32c10 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
32c20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
32c30 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
32c40 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
32c50 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
32c60 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
32c70 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
32c80 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
32c90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
32ca0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
32cb0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
32cc0 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
32cd0 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
32ce0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
32cf0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
32d00 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
32d10 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
32d20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
32d30 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
32d40 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
32d50 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
32d60 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
32d70 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
32d80 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
32d90 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
32da0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
32db0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
32dc0 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
32dd0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
32de0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
32df0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
32e00 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
32e10 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
32e20 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
32e30 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
32e40 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
32e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
32e60 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
32e70 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
32e80 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
32e90 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
32ea0 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
32eb0 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74  , off).#endif.st
32ec0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32ed0 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
32ee0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32f00 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
32f10 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
32f20 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
32f30 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
32f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32f50 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
32f60 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
32f70 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
32f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32f90 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
32fa0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
32fb0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
32fc0 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20  .  int isRoot,  
32fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fe0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
32ff0 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
33000 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42  page */.  int bB
33010 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ulk             
33020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
33030 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e if this call i
33040 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b  s part of a bulk
33050 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74   load */.){.  Bt
33060 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
33070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
33080 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
33090 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
330a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
330b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
330c0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
330d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
330e0 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
330f0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
33100 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
33110 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
33120 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
33130 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33140 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33150 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
33160 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
33170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33190 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
331a0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
331b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
331c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
331d0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
331e0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
331f0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
33200 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
33210 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
33220 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33230 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
33240 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
33250 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
33260 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
33270 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
33280 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
33290 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
332a0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
332b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
332c0 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
332d0 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
332e0 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
332f0 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
33300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
33310 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
33320 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
33330 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
33340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33350 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
33360 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
33370 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33390 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
333a0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
333b0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
333c0 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
333d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
333e0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
333f0 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
33400 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
33410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
33420 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
33430 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
33440 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
33450 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
33460 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
33470 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
33480 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
33490 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
334a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
334b0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
334c0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
334d0 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
334e0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
334f0 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
33500 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
33510 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
33520 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
33530 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
33540 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
33550 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
33560 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
33570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33580 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
33590 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
335a0 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
335b0 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
335c0 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
335d0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
335e0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
335f0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
33600 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
33610 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
33620 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
33630 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
33640 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
33650 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
33660 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
33670 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
33680 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
33690 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
336a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
336b0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
336c0 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
336d0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
336e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
336f0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
33700 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
33710 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
33720 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
33730 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
33740 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
33750 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
33760 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33780 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
33790 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
337a0 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
337b0 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
337c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
337d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
337e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
337f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33800 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
33810 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
33820 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
33830 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
33840 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
33850 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
33860 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
33870 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
33880 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
33890 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
338a0 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
338b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
338c0 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
338d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
338e0 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
338f0 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
33900 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
33910 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
33920 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
33930 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
33940 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
33950 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
33960 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
33970 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
33980 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
33990 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
339a0 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
339b0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
339c0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
339d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
339e0 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66  | pParent->aiOvf
339f0 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78  l[0]==iParentIdx
33a00 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
33a10 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
33a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33a30 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
33a40 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
33a50 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
33a60 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
33a70 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
33a80 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
33a90 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
33aa0 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
33ab0 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
33ac0 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
33ad0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
33ae0 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
33af0 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
33b00 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
33b10 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
33b20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
33b30 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
33b40 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
33b50 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
33b60 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
33b70 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
33b80 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
33b90 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
33ba0 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
33bb0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
33bc0 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
33bd0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
33be0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
33bf0 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
33c00 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
33c10 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
33c20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
33c30 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
33c40 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
33c50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33c60 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
33c70 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
33c80 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
33c90 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
33ca0 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
33cb0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
33cc0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
33cd0 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
33ce0 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
33cf0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33d00 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42  ( bBulk==0 || bB
33d10 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  ulk==1 );.    if
33d20 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
33d30 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
33d40 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
33d50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
33d60 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
33d70 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
33d80 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20  = i-2+bBulk;.   
33d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
33da0 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29  sert( bBulk==0 )
33db0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  ;.      nxDiv = 
33dc0 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
33dd0 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42    }.    i = 2-bB
33de0 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  ulk;.  }.  nOld 
33df0 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b  = i+1;.  if( (i+
33e00 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
33e10 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
33e20 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
33e30 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
33e40 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
33e50 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
33e60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
33e70 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
33e80 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
33e90 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
33ea0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
33eb0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
33ec0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
33ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
33ee0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
33ef0 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  pgno, &apOld[i],
33f00 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
33f10 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
33f20 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
33f30 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
33f40 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
33f50 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33f60 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
33f70 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
33f80 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
33f90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
33fa0 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
33fb0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
33fc0 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
33fd0 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70  ->aiOvfl[0] && p
33fe0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33ff0 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
34000 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
34010 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pOvfl[0];.      
34020 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
34030 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
34040 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
34050 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
34060 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
34070 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
34080 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
34090 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
340a0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
340b0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
340c0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
340d0 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
340e0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
340f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
34100 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
34110 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
34120 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
34130 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
34140 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
34150 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
34160 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
34170 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
34180 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
34190 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
341a0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
341b0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
341c0 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
341d0 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
341e0 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
341f0 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
34200 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
34210 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
34220 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
34230 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
34240 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
34250 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
34260 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
34270 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
34280 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
34290 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
342a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
342b0 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65  ut not if we are
342c0 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
342d0 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72  e mode. In secur
342e0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20  e-delete mode,. 
342f0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
34300 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
34310 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
34320 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
34330 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
34340 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
34350 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
34360 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
34370 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
34380 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
34390 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
343a0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
343b0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
343c0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
343d0 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
343e0 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
343f0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
34400 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
34410 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
34420 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  int iOff;..     
34430 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45     iOff = SQLITE
34440 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69  _PTR_TO_INT(apDi
34450 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50  v[i]) - SQLITE_P
34460 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e  TR_TO_INT(pParen
34470 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
34480 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e     if( (iOff+szN
34490 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d  ew[i])>(int)pBt-
344a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
344b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
344c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
344d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  T;.          mem
344e0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
344f0 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
34500 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ge*));.         
34510 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
34520 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
34530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34540 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
34550 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b  ce[iOff], apDiv[
34560 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
34570 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69           apDiv[i
34580 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  ] = &aOvflSpace[
34590 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
345a0 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20  ->aData];.      
345b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
345c0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
345d0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
345e0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
345f0 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
34600 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34610 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
34620 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
34630 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
34640 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
34650 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
34660 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
34670 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
34680 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
34690 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
346a0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
346b0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
346c0 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
346d0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
346e0 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
346f0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
34700 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34720 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
34730 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
34740 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34760 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
34770 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
34780 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
34790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347a0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
347b0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
347c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
347f0 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
34800 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
34810 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
34820 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
34830 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
34840 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
34850 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
34860 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34870 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
34880 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
34890 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
348a0 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
348b0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
348c0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
348d0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
348e0 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
348f0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
34900 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
34910 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
34920 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
34930 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
34940 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
34950 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
34960 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
34970 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
34980 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
34990 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
349a0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
349b0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
349c0 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
349d0 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
349e0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
349f0 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
34a00 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
34a10 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
34a20 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
34a30 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
34a40 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
34a50 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
34a60 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
34a70 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
34a80 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
34a90 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
34aa0 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
34ab0 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
34ac0 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
34ad0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
34ae0 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
34af0 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
34b00 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
34b10 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
34b20 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
34b30 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
34b40 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
34b50 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
34b60 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
34b70 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
34b80 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
34b90 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
34ba0 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
34bb0 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
34bc0 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
34bd0 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
34be0 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
34bf0 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
34c00 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
34c10 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
34c20 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
34c30 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
34c40 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
34c50 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
34c60 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
34c70 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
34c80 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
34c90 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
34ca0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
34cb0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
34cc0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
34cd0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
34ce0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
34cf0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
34d00 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
34d10 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
34d20 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
34d30 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
34d40 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
34d50 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
34d60 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
34d70 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
34d80 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
34d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
34da0 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
34db0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
34dc0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
34dd0 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
34de0 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
34df0 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
34e00 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
34e10 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
34e20 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
34e30 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
34e40 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
34e50 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
34e60 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
34e70 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
34e80 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
34e90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34ea0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
34eb0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
34ec0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
34ed0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
34ee0 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
34ef0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34f00 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
34f10 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
34f20 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
34f30 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
34f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
34f50 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
34f60 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
34f70 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
34f80 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
34f90 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
34fa0 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
34fb0 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
34fc0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
34fd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34fe0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
34ff0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
35000 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
35010 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
35020 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
35030 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
35040 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
35050 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
35060 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
35070 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
35080 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
35090 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
350a0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
350b0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
350c0 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
350d0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
350e0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
350f0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
35100 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
35110 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
35120 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
35130 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
35140 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
35150 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
35160 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
35170 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
35180 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
35190 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
351a0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
351b0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
351c0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
351d0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
351e0 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
351f0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
35200 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
35210 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
35220 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
35230 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
35240 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
35250 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
35260 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
35270 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
35280 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
35290 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
352a0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
352b0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
352c0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
352d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
352e0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
352f0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
35300 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
35310 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
35320 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
35330 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
35340 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
35350 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
35360 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
35370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
35390 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
353a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
353b0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
353c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
353d0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
353e0 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
353f0 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
35400 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
35410 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
35420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35430 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
35440 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
35450 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
35460 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35470 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
35480 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
35490 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
354a0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
354b0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
354c0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
354d0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
354e0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
354f0 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
35500 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
35510 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
35520 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
35530 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
35540 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
35550 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
35560 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
35570 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
35580 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
35590 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
355a0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
355b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
355c0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
355d0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
355e0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
355f0 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
35600 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
35610 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
35620 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
35630 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
35640 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
35650 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
35660 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
35670 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
35680 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
35690 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
356a0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
356b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
356c0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
356d0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
356e0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
356f0 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
35700 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35710 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
35720 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
35730 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
35740 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
35750 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
35760 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
35770 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
35780 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
35790 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
357a0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
357b0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
357c0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
357d0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
357e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
357f0 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
35800 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
35810 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
35820 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
35830 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
35840 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
35850 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
35860 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
35870 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
35880 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
35890 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
358a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
358b0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
358c0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
358d0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
358e0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
358f0 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
35900 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
35910 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
35920 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
35930 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
35940 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
35950 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
35960 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
35970 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
35980 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
35990 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
359a0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
359b0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
359c0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
359d0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
359e0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
359f0 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
35a00 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
35a10 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
35a20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
35a30 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
35a40 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
35a50 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
35a60 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
35a70 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
35a80 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
35a90 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
35aa0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
35ab0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
35ac0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
35ad0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
35ae0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
35af0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35b00 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
35b10 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
35b20 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
35b30 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35b40 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
35b50 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
35b60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
35b70 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
35b80 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
35b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
35ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35bb0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
35bc0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
35bd0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
35be0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
35bf0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
35c00 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35c10 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
35c20 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
35c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
35c40 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35c50 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
35c60 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
35c70 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
35c80 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
35c90 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
35ca0 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
35cb0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
35cc0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
35cd0 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
35ce0 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
35cf0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
35d00 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
35d10 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
35d20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35d30 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
35d40 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
35d50 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
35d60 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
35d70 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
35d80 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
35d90 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
35da0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
35db0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
35dc0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
35dd0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
35de0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
35df0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
35e00 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
35e10 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
35e20 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
35e30 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
35e40 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
35e50 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
35e60 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
35e70 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
35e80 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
35e90 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
35ea0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
35eb0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
35ec0 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
35ed0 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
35ee0 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
35ef0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
35f00 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
35f10 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
35f20 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
35f30 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
35f40 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
35f50 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
35f60 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
35f70 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
35f80 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
35f90 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
35fa0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
35fb0 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
35fc0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
35fd0 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
35fe0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
35ff0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
36000 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
36010 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
36020 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
36030 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
36040 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
36050 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36060 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
36070 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
36080 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
36090 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
360a0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
360b0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
360c0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
360d0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
360e0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
360f0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
36100 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
36110 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
36120 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36130 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
36140 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
36150 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
36160 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
36170 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
36180 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
36190 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
361a0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
361b0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
361c0 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
361d0 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
361e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
361f0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
36200 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
36210 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
36220 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
36230 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
36240 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
36250 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
36260 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
36270 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
36280 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
36290 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
362a0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
362b0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
362c0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
362d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
362e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
362f0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
36300 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
36310 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
36320 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
36330 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
36340 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
36350 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
36360 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
36370 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
36380 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
36390 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
363a0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
363b0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
363c0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
363d0 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
363e0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
363f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
36400 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
36410 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
36420 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
36430 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
36440 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
36450 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
36460 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
36470 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
36480 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
36490 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
364a0 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
364b0 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
364c0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
364d0 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
364e0 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
364f0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
36500 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
36510 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
36520 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
36530 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
36540 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
36550 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
36560 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
36570 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
36580 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
36590 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
365a0 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
365b0 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
365c0 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
365d0 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
365e0 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
365f0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
36600 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
36610 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
36620 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
36630 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
36640 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
36650 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
36660 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
36670 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
36680 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
36690 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
366a0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
366b0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
366c0 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
366d0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
366e0 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
366f0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
36700 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
36710 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
36720 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
36730 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
36740 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
36750 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
36760 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
36770 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
36780 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
36790 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
367a0 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
367b0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
367c0 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
367d0 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
367e0 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
367f0 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
36800 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36810 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
36820 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
36830 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
36840 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
36850 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
36860 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
36870 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
36880 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
36890 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
368a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
368b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
368c0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
368d0 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
368e0 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
368f0 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
36900 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
36910 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
36920 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
36930 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
36940 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
36950 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
36960 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
36970 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
36980 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
36990 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
369a0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
369b0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
369c0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
369d0 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
369e0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
369f0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
36a00 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
36a10 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
36a20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
36a30 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
36a40 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
36a50 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
36a60 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
36a70 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
36a80 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
36a90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
36aa0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
36ab0 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
36ac0 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
36ad0 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
36ae0 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
36af0 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
36b00 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
36b10 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
36b20 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
36b30 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
36b40 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
36b50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
36b60 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
36b70 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
36b80 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
36b90 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
36ba0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
36bb0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
36bc0 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36bd0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
36be0 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
36bf0 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
36c00 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
36c10 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
36c20 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
36c30 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
36c40 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
36c50 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
36c60 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
36c70 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
36c80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
36c90 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
36ca0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36cb0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
36cc0 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
36cd0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
36ce0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
36cf0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
36d00 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
36d10 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
36d20 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
36d30 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
36d40 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
36d50 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
36d60 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
36d70 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
36d80 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
36d90 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
36da0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
36db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36dc0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36dd0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
36de0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
36df0 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
36e00 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
36e10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
36e20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
36e30 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
36e40 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
36e50 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
36e60 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
36e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36e80 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
36e90 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
36ea0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
36eb0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
36ec0 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
36ed0 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
36ee0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
36ef0 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
36f00 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
36f10 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
36f20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
36f30 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
36f40 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
36f50 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
36f60 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
36f70 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
36f80 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
36f90 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
36fa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
36fb0 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
36fc0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
36fd0 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
36fe0 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
36ff0 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
37000 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
37010 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
37020 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
37030 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
37040 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
37050 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
37060 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
37070 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
37080 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
37090 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
370a0 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
370b0 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
370c0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
370d0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
370e0 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
370f0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
37100 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
37110 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
37120 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
37130 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
37140 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
37150 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
37160 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
37170 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37180 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
37190 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
371a0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
371b0 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
371c0 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
371d0 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74  pace <= (int)pBt
371e0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
371f0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
37200 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
37210 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
37220 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
37230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
37250 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
37260 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
37270 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37280 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
37290 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
372a0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
372b0 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
372c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
372d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
372e0 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
372f0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
37300 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
37310 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
37320 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
37330 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
37340 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
37350 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
37360 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
37370 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
37380 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
37390 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
373a0 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
373b0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
373c0 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
373d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
373e0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
373f0 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
37400 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
37410 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
37420 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
37430 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
37440 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
37450 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
37460 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
37470 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
37480 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
37490 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
374a0 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
374b0 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
374c0 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
374d0 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
374e0 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
374f0 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
37500 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
37510 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
37520 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
37530 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
37540 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
37550 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
37560 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
37570 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
37580 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
37590 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
375a0 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
375b0 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
375c0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
375d0 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
375e0 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
375f0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
37600 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
37610 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
37620 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
37630 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
37640 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
37650 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
37660 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
37670 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
37680 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
37690 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
376a0 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
376b0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
376c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
376d0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
376e0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
376f0 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
37700 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
37710 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
37720 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
37730 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
37740 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
37750 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
37760 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
37770 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
37780 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
37790 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
377a0 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
377b0 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
377c0 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
377d0 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
377e0 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
377f0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
37800 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
37810 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
37820 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
37830 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
37840 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
37850 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
37860 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
37870 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
37880 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
37890 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
378a0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
378b0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
378c0 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
378d0 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
378e0 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
378f0 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
37900 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
37910 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
37920 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
37930 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
37940 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
37950 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
37960 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
37970 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
37980 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
37990 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
379a0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
379b0 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
379c0 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
379d0 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
379e0 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
379f0 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
37a00 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
37a10 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
37a20 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
37a30 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
37a40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
37a50 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
37a60 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
37a70 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37a80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37a90 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
37aa0 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
37ab0 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
37ac0 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
37ad0 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
37ae0 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
37af0 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
37b00 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
37b10 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
37b20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
37b30 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
37b40 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
37b50 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
37b60 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
37b70 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
37b80 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
37b90 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
37ba0 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
37bb0 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
37bc0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
37bd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37be0 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
37bf0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37c00 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
37c10 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
37c20 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
37c30 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
37c40 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
37c50 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
37c60 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
37c70 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
37c80 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
37c90 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
37ca0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
37cb0 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
37cc0 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
37cd0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37ce0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
37cf0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37d00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
37d10 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
37d20 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
37d30 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
37d40 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
37d50 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
37d60 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
37d70 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
37d80 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
37d90 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
37da0 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
37db0 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
37dc0 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
37dd0 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
37de0 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
37df0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
37e00 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
37e10 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
37e20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
37e30 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
37e40 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
37e50 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
37e60 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
37e70 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
37e80 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
37e90 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
37ea0 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
37eb0 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
37ec0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
37ed0 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
37ee0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
37ef0 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
37f00 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
37f10 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
37f20 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
37f30 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
37f40 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
37f50 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
37f60 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
37f70 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d  d->aiOvfl[0] : -
37f80 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
37f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
37fb0 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
37fc0 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
37fd0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ff0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
38000 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
38010 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
38020 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
38030 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
38040 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
38050 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
38060 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
38070 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
38080 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
38090 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
380a0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
380b0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
380c0 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
380d0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
380e0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
380f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
38100 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
38110 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
38120 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
38130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
38140 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
38150 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
38160 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
38170 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20  nOld );.        
38180 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
38190 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
381a0 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
381b0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
381c0 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
381d0 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  flow;.        if
381e0 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
381f0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  w ){.          n
38200 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
38210 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
38220 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20        iOverflow 
38230 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
38240 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  + pOld->aiOvfl[0
38250 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
38260 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
38270 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
38280 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
38290 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
382a0 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
382b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
382c0 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
382d0 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70  ld->aiOvfl[0]==p
382e0 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31  Old->aiOvfl[1]-1
382f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
38300 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
38310 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d  Old->aiOvfl[1]==
38320 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d  pOld->aiOvfl[2]-
38330 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  1);.      if( i=
38340 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  =iOverflow ){.  
38350 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
38360 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
38370 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30   (--nOverflow)>0
38380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
38390 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20  verflow++;.     
383a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
383b0 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65      if( i==cntNe
383c0 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  w[k] ){.        
383d0 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
383e0 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
383f0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
38400 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77  last cell on new
38410 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
38420 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74  ing page k. If t
38430 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
38440 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
38450 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
38460 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 2