/ Hex Artifact Content
Login

Artifact 3f7bbfd72efb1cbf6a49515c376a031767ec930a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20   aSpace[150];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c   pIdxKey);.  }el
5b00: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b30: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b40: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b50: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b60: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5b80: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5b90: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bb0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5bc0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bd0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5be0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5bf0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c00: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c10: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c20: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c30: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c40: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c50: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c60: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5c80: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5c90: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5ca0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cb0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5cc0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cd0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5cf0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d00: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d10: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5d80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5d90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5da0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5db0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5dc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5dd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5de0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5df0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e10: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e20: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e50: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e60: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e70: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5e80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5e90: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ea0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5eb0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
5ee0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ef0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
5f00: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
5f10: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
5f20: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
5f30: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f40: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
5f50: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
5f60: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
5f70: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
5f80: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
5f90: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
5fa0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
5fb0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20  ed at.  Cursors 
5fc0: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
5fd0: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
5fe0: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73  ointing.** at is
5ff0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
6000: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a  m under them..**
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
6030: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
6040: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
6050: 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
6060: 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65  *pHasMoved is se
6070: 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20  t to one if the 
6080: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6090: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
60a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
60b0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
60c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
60d0: 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29   int *pHasMoved)
60e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  {.  int rc;..  r
60f0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6100: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6110: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6120: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6130: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6140: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
6150: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6160: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b  ALID || pCur->sk
6170: 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a 20 20 20  ipNext!=0 ){.   
6180: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
61a0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
61c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
61d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
61e0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
61f0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6200: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6210: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6220: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6230: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6240: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6260: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6270: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6280: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6290: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
62a0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
62b0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
62c0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
62d0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
62e0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
62f0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
6300: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
6310: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
6320: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
6330: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
6340: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
6350: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6360: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
6370: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6380: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
6390: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
63a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
63d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
63e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
63f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
6400: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
6410: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
6420: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
6430: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
6440: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
6450: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
6480: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
6490: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
64a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
64b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
64c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
64d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
64e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
64f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
6500: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
6510: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
6520: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
6530: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6540: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
6550: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
6560: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
6570: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
6580: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
6590: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
65a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
65b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
65c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
65d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
65e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
65f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
6600: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
6610: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6620: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
6630: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
6640: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6650: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
6660: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6670: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6680: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6690: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
66a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
66b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
66c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
66d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
66e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
66f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
6700: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
6720: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
6730: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
6740: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
6750: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
6760: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6770: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6780: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
6790: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
67a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
67b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
67c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
67d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
67e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
67f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
6800: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
6810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
6820: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
6830: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
6840: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6850: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6860: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6870: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6880: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6890: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
68a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
68b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
68c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
68d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
68e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
68f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6900: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
6910: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
6920: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
6930: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
6940: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6950: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6960: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
6970: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
6980: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
6990: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
69a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
69b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
69c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
69d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
69e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
69f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
6a00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6a10: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
6a20: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
6a30: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
6a40: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
6a50: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
6a60: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
6a70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
6a80: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6aa0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6ab0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6ac0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6ad0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6ae0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6af0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6b00: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6b10: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6b20: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
6b30: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
6b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6b60: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
6b70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6b80: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
6b90: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
6ba0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
6bb0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
6bc0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
6bd0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
6be0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
6bf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
6c00: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
6c10: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
6c20: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
6c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6c40: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
6c50: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6c60: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
6c70: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
6c80: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
6c90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
6cb0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6cc0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6cd0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
6ce0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
6cf0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
6d00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
6d10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
6d20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
6d30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
6d40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
6d50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6d60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6d70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6d80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6d90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6da0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6db0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6dc0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6dd0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6de0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
6df0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6e00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
6e10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
6e20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
6e30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
6e40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
6e50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
6e60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
6e70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6e80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
6e90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6ea0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6eb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
6ec0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
6ed0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
6ee0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
6ef0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
6f00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
6f10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
6f20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
6f30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6f40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
6f50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6f60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
6f70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
6f80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
6f90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6fb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
6fc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
6fd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6fe0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
6ff0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7000: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7010: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7020: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7030: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7040: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7050: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7060: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7070: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7080: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7090: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
70a0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
70b0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
70c0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
70d0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
70e0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
70f0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
7110: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
7120: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
7130: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7140: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
7150: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
7160: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
7170: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
7180: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
7190: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
71a0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
71b0: 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29  dCellv2(D,M,O,I)
71c0: 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28   (D+(M&get2byte(
71d0: 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a  D+(O+2*(I)))))..
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
71f0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
7200: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
7210: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
7220: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
7230: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
7240: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
7250: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
7260: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
7270: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7280: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
7290: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
72a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
72b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
72c0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
72d0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
72e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
72f0: 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65  k;.    k = pPage
7300: 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->aiOvfl[i];.   
7310: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
7320: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
7330: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
7340: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f  eturn pPage->apO
7350: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  vfl[i];.      }.
7360: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
7370: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7380: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
7390: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
73a0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
73b0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
73c0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
73d0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
73e0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
73f0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
7400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
7410: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
7420: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
7430: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
7440: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
7450: 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  nd btreeParseCel
7460: 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73  lPtr() .** takes
7470: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7480: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65  e body of the ce
7490: 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64  ll as its second
74a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
74b0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c   Within this fil
74c0: 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c  e, the parseCell
74d0: 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20  () macro can be 
74e0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f  called instead o
74f0: 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  f.** btreeParseC
7500: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
7510: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
7520: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
7530: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
7540: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7550: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
7560: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7570: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7580: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7590: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
75a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
75b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
75c0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
75d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
75e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
75f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7600: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
7630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
7640: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
7650: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7670: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7680: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
76a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
76b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
76c0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
76d0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
76e0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
76f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
7700: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
7710: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
7720: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
7730: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
7740: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
7750: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
7760: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7770: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72       n += getVar
7780: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
7790: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
77a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
77b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
77c0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
77d0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
77e0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
77f0: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7800: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7820: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7830: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7840: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7850: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7860: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7870: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7880: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7890: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
78a0: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
78b0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
78c0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
78d0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
78e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
78f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7900: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7910: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7920: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7930: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7940: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7950: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7960: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7970: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7980: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7990: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
79a0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
79b0: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
79c0: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
79d0: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
79e0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
79f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7a00: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7a10: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7a20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7a30: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7a40: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7a50: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7a60: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7a70: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7a80: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7a90: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7aa0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7ab0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7ac0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7ad0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7ae0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7af0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7b00: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7b10: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7b20: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7b30: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7b40: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7b50: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7b60: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7b70: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7b80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7b90: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7ba0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7bb0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7bc0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7bd0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7be0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7bf0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7c00: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7c10: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7c20: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7c30: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c40: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c50: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7c60: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7c70: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c80: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c90: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7ca0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7cb0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7cc0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7cd0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7ce0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7cf0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7d00: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7d10: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7d20: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7d30: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7d40: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7d50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7d60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7d70: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7d90: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
7da0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
7db0: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
7dc0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
7dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
7de0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
7df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
7e00: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
7e10: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
7e20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7e30: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
7e40: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
7e50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
7e60: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
7e70: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
7e80: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
7e90: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7ea0: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
7eb0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
7ec0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
7ed0: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
7ee0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
7ef0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f00: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
7f10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7f20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7f30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7f40: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7f60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
7f70: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
7f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
7f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
7fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
7fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
7fc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7fd0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
7ff0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8000: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8010: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8020: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8030: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
8040: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
8050: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
8060: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
8070: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
8080: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
8090: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
80a0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
80b0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
80c0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
80d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
80e0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
80f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8100: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8110: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8120: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8130: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
8140: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
8150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
81a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
81b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
81c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
81d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
81e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
81f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8280: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8290: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
82a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
82b0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
82c0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
82d0: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
82e0: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
82f0: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8300: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8310: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8330: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
8340: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
8350: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8360: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8370: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8380: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8390: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
83a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
83b0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
83c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
83d0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
83e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
83f0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8400: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8410: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8420: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8430: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8440: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
8450: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8460: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8470: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
8480: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8490: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
84a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
84b0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
84c0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
84d0: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
84e0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
84f0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8500: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8510: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8520: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8530: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8540: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8550: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8570: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8580: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8590: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
85a0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
85b0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
85c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
85d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
85e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
85f0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8600: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8610: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8620: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8630: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
8640: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
8650: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
8660: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
8670: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
8680: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
8690: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
86a0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
86b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
86c0: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
86d0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
86e0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
86f0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8700: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8710: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8720: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8730: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
8740: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
8750: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8760: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
8770: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
8780: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
8790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
87a0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
87b0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
87c0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
87d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
87e0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
87f0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8800: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8810: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8820: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8830: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8840: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8850: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8870: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8880: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8890: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
88a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
88b0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
88c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
88d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
88e0: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
88f0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8900: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8910: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8920: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8930: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8940: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8950: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8960: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8970: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8980: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8990: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
89a0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
89b0: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
89c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
89d0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
89e0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
89f0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8a00: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8a10: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8a20: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8a30: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8a40: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8a50: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8a60: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8a70: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8a80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8a90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8aa0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8ac0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8ad0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8b00: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b20: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8b30: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8b40: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8b70: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8b80: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8ba0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8bb0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8bd0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8be0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8c00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8c10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8c20: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c30: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8c40: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8c50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8c60: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8c70: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8c80: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8ca0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8cb0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8cc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8cd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8ce0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8cf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8d00: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8d10: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8d20: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8d30: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8d40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8d50: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8d60: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8d70: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8d80: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8d90: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
8da0: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
8db0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8dc0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8dd0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8e00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8e10: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
8e20: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
8e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8e40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
8e50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8e60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8e70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8e80: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
8e90: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
8ea0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
8eb0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
8ec0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8ed0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
8ee0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
8ef0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
8f00: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
8f10: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
8f20: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
8f30: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
8f40: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
8f50: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8f60: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8f70: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
8f80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8f90: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
8fa0: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
8fb0: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
8fc0: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
8fd0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
8fe0: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
8ff0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9000: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9010: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9020: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9030: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
9040: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
9050: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
9060: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
9070: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
9080: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
9090: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
90a0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
90b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90c0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
90d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90e0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
90f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9100: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9110: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9120: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9130: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
9140: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
9150: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
9160: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
9170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9180: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
9190: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
91a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
91b0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
91c0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
91d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9200: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9210: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9220: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9230: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
9240: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
9250: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9260: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9270: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9280: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9290: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
92a0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
92c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92d0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
92e0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
92f0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9310: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9320: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9330: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9340: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9350: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9360: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9370: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9380: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
93a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
93b0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
93c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
93d0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
93e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
93f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9400: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9410: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9420: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9430: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9440: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
9450: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
9460: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
9470: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9480: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
9490: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
94a0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
94b0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
94c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
94d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
94e0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
94f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9500: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9540: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9550: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
9560: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
9570: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
9580: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
9590: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
95a0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
95b0: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
95c0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
95d0: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
95e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
95f0: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9600: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9610: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9620: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9630: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
9640: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
9650: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
9660: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
9670: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
9680: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
9690: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
96a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
96b0: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
96c0: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
96d0: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
96e0: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
96f0: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9700: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9710: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9720: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9730: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
9740: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
9750: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
9760: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
9770: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
9780: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
9790: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
97a0: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
97b0: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
97c0: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
97d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
97e0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
97f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9800: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9810: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9820: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9830: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9840: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9850: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9860: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9870: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9880: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9890: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
98a0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
98b0: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98e0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
98f0: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9900: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9930: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9940: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9950: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9960: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9970: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9980: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9990: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
99a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
99b0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
99c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
99d0: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
99e0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
99f0: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9a00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9a10: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9a20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9a30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a40: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9a50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9a60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9a70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9a80: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9a90: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9aa0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9ab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ac0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ae0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9af0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9b00: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9b10: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9b20: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9b30: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9b40: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9b50: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9b60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9b70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9b80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9b90: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9ba0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9bb0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9bc0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9bd0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9be0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9c10: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9c20: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9c30: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9c40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9c50: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9c60: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9c70: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9c80: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9c90: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9ca0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9cb0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9cc0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9cd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9ce0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9cf0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9d00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9d10: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9d20: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9d30: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9d40: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9d50: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9d60: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9d70: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9d80: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9d90: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
9da0: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
9db0: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
9dc0: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
9dd0: 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  gh to accommodat
9de0: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
9df0: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
9e00: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
9e10: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
9e20: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
9e30: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
9e40: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
9e60: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
9e70: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63   */.      if( pc
9e80: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
9e90: 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20   pc<addr+4 ){.  
9ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9eb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ed0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
9ee0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
9ef0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
9f00: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
9f10: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
9f20: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
9f30: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
9f40: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9f50: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
9f60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
9f70: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
9f80: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
9f90: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
9fa0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
9fb0: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
9fc0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9fd0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
9fe0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
9ff0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a000: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a010: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a020: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
a030: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
a040: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
a050: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
a060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a080: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0a0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a0b0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a0c0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a0d0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a0e0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
a0f0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a100: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a110: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a120: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
a130: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
a140: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
a150: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
a160: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
a170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a180: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a190: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a1a0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
a1b0: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
a1c0: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
a1d0: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
a1e0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
a1f0: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
a200: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
a210: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
a220: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
a230: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
a240: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
a250: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a260: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a270: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a280: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a290: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a2a0: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
a2b0: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
a2c0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
a2d0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
a2e0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
a2f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a300: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
a310: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a320: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
a330: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
a340: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
a350: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
a360: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
a370: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
a380: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
a390: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
a3a0: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
a3b0: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
a3c0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
a3d0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
a3e0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
a3f0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
a400: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
a410: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
a420: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
a430: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a440: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
a450: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
a460: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a470: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
a480: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
a490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a4b0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
a4c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
a4d0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
a4e0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
a4f0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
a500: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
a510: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
a520: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a530: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
a540: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
a550: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
a560: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
a570: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
a580: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
a590: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
a5a0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
a5b0: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
a5c0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
a5d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a5e0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
a5f0: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
a600: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
a610: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
a640: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
a650: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
a660: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a670: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a680: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
a690: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a6b0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a6c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a6d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
a6e0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
a6f0: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
a700: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
a710: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
a720: 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70   size) <= (int)p
a730: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a740: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a750: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a760: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a770: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a780: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a790: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a7a0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a7b0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a7c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
a7d0: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
a7e0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a7f0: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a800: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a810: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a820: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a830: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a840: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a850: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a860: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a870: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a880: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a890: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a8a0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a8b0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a8c0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a8d0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a8e0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a8f0: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a900: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a910: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a920: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a930: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a940: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a950: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a960: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a970: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a980: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a990: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a9a0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a9b0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a9c0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a9d0: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a9e0: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a9f0: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
aa00: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
aa10: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
aa20: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
aa30: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
aa40: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
aa50: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
aa60: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
aa70: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
aa80: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
aa90: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
aaa0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
aab0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
aac0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
aad0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
aae0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
aaf0: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ab00: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ab10: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
ab20: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
ab30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ab40: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ab50: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
ab60: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
ab70: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
ab80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ab90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
aba0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
abb0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
abc0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
abd0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
abe0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
abf0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
ac00: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
ac10: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
ac20: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
ac30: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
ac40: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
ac50: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
ac60: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
ac70: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
ac80: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
ac90: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
aca0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
acb0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
acc0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
acd0: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
ace0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
acf0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ad00: 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70  pbegin <= (int)p
ad10: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ad20: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
ad30: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
ad40: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
ad50: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
ad60: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
ad70: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
ad80: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
ad90: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
ada0: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
adb0: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
adc0: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
add0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
ade0: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
adf0: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20  nt)data[hdr+7]) 
ae00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ae10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ae20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
ae30: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
ae40: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
ae50: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
ae60: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
ae70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ae80: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
ae90: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
aea0: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
aeb0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
aec0: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
aed0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
aee0: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
aef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
af00: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
af10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
af20: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
af30: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
af40: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
af50: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
af60: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
af70: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
af80: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
af90: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
afa0: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
afb0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
afc0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
afd0: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
afe0: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
aff0: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
b000: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b010: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
b020: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b030: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
b040: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b050: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
b060: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b070: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b080: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b0a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
b0b0: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b0c0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b0d0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b0e0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b0f0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b100: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b110: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b120: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
b130: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
b140: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
b150: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
b160: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
b170: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
b180: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b190: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
b1a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b1b0: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
b1c0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
b1d0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
b1e0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b1f0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
b200: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b210: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b220: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
b230: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
b240: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
b250: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
b260: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
b270: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
b280: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
b290: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
b2a0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
b2b0: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
b2c0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
b2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b2e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b2f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b300: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
b310: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
b320: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
b330: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
b340: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
b350: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
b360: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b370: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
b380: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
b390: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
b3a0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
b3b0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b3c0: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
b3d0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
b3e0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b3f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
b400: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
b410: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b420: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b430: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b440: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b450: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
b460: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
b470: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
b480: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
b490: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
b4a0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b4b0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b4c0: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b4d0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b4e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
b4f0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
b500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b510: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
b520: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
b530: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
b540: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
b550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b560: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b570: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b580: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b590: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b5a0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b5b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b5c0: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b5d0: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b5e0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b5f0: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b600: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b610: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b620: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b630: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b640: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b650: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b660: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b670: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b680: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b690: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b6a0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b6b0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b6c0: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b6d0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b6e0: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b6f0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b700: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b710: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b720: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b730: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b740: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b750: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b760: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b770: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b780: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b790: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b7a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b7b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b7c0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
b7d0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b7e0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b7f0: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
b800: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
b810: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
b820: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b830: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b840: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b850: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
b860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b870: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b880: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b890: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
b8a0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b8b0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b8c0: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
b8d0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
b8e0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
b8f0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
b900: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
b910: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b920: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b930: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b940: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
b950: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
b960: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
b970: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
b980: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b990: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
b9a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b9b0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
b9c0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b9d0: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
b9e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
b9f0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
ba00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
ba10: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
ba20: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
ba30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
ba40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
ba50: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
ba60: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
ba70: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
ba80: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
ba90: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
baa0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
bab0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
bac0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bad0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bae0: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
baf0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bb00: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
bb10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bb20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
bb30: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
bb40: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
bb50: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
bb60: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
bb70: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
bb80: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
bb90: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
bba0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
bbb0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
bbc0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
bbd0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
bbe0: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
bbf0: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
bc00: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
bc10: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
bc20: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
bc30: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bc40: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
bc50: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bc60: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bc70: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bc80: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bc90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bca0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bcb0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bcc0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bcd0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bce0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bcf0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bd00: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bd10: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bd20: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bd30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd40: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bd50: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bd60: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bd70: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bd80: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bd90: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
bda0: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
bdb0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
bdc0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
bdd0: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
bde0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
bdf0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
be00: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
be10: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
be20: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
be30: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
be40: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
be50: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
be60: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
be70: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
be80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
be90: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
bea0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
beb0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
bec0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
bed0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
bee0: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
bef0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
bf00: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
bf10: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
bf20: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
bf30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bf40: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
bf50: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
bf60: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
bf70: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
bf80: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
bf90: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
bfa0: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
bfb0: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
bfc0: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
bfd0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
bfe0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
bff0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
c000: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
c010: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c020: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
c030: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c040: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c050: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c060: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c070: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c080: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c090: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c0a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c0b0: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
c0c0: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
c0d0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
c0e0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
c0f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c100: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
c110: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c120: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c130: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c140: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
c150: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c160: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c170: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c180: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c190: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c1a0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c1b0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c1c0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c1d0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c1e0: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c1f0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c200: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c210: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c220: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c230: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c240: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c250: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c260: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c270: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c280: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c290: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c2a0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c2b0: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c2c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c2d0: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c2e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c2f0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c300: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c310: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c320: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c330: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c340: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c350: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c360: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c370: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20  e last byte of. 
c380: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
c390: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
c3a0: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c3b0: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c3c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c3e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c3f0: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c400: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c410: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c420: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c430: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c440: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c450: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c460: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c470: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c480: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c490: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c4a0: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c4b0: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c4c0: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c4d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c4e0: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c4f0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c500: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c510: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c520: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c530: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c540: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c550: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c560: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c570: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c580: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c590: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c5a0: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c5b0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c5c0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c5d0: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c5e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c600: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c610: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c620: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c630: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c650: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c660: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c670: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c680: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c690: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c6a0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c6b0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c6c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c6d0: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c6e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c6f0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c700: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c710: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c720: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c730: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c740: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c750: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c760: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c770: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c780: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c790: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
c7a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c7b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c7c0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c7d0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
c7e0: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
c7f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c800: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c810: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
c820: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c830: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c840: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c850: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c860: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c870: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
c880: 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
c890: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
c8a0: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
c8b0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
c8c0: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
c8d0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
c8e0: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
c8f0: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
c900: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
c910: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
c920: 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20  AF)==0 ?1:0);.  
c930: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c940: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
c950: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c960: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c970: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
c980: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
c990: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c9a0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
c9b0: 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
c9c0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
c9d0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
c9e0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
c9f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
ca00: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
ca10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
ca20: 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
ca30: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
ca40: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
ca50: 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
ca60: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ca70: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
ca80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
ca90: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
caa0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
cab0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
cac0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
cad0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
cae0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
caf0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
cb00: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
cb10: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
cb20: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
cb30: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
cb40: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
cb50: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
cb60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
cb70: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
cb80: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
cb90: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
cba0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
cbb0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
cbc0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
cbd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
cbe0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
cbf0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
cc00: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
cc10: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
cc20: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
cc30: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
cc40: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
cc50: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
cc60: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
cc70: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
cc80: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
cc90: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
cca0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
ccb0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
ccc0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
ccd0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
cce0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
ccf0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
cd00: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
cd10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
cd20: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
cd30: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
cd40: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
cd50: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
cd60: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
cd70: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
cd80: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
cd90: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
cda0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
cdb0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
cdc0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
cdd0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
cde0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
cdf0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
ce00: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
ce10: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
ce20: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
ce30: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
ce40: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
ce50: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
ce60: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
ce70: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
ce80: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
ce90: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
cea0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
ceb0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
cec0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
ced0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
cee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cef0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
cf00: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
cf10: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
cf20: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
cf30: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
cf40: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
cf50: 6e 74 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  ntent,       /* 
cf60: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
cf70: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
cf80: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f   */.  int bReado
cf90: 6e 6c 79 20 20 20 20 20 20 20 20 2f 2a 20 54 72  nly        /* Tr
cfa0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
cfb0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
cfc0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
cfd0: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
cfe0: 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 66 6c 61  bPage;.  int fla
cff0: 67 73 20 3d 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  gs = (noContent 
d000: 3f 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f  ? PAGER_ACQUIRE_
d010: 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 29 20 0a  NOCONTENT : 0) .
d020: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 62              | (b
d030: 52 65 61 64 6f 6e 6c 79 20 3f 20 50 41 47 45 52  Readonly ? PAGER
d040: 5f 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c  _ACQUIRE_READONL
d050: 59 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72  Y : 0);..  asser
d060: 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
d070: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
d080: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d090: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d0a0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d0b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d0c0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
d0d0: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
d0e0: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
d0f0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
d100: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d110: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
d120: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
d130: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
d140: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
d150: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d160: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
d170: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d180: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
d190: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
d1a0: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
d1b0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d1c0: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
d1d0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
d1e0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
d1f0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
d200: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
d210: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
d220: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
d230: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
d240: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
d250: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
d260: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d280: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d290: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
d2a0: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
d2b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
d2c0: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
d2d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
d2e0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d2f0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d300: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
d310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d320: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
d330: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d340: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
d350: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
d360: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
d370: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
d380: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
d390: 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
d3a0: 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
d3b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
d3c0: 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
d3d0: 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
d3e0: 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
d3f0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
d400: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
d410: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
d420: 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
d430: 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
d440: 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
d450: 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65  n (int)btreePage
d460: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
d470: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d480: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d490: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
d4a0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
d4b0: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
d4c0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
d4d0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
d4e0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
d4f0: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
d500: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
d510: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
d520: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d530: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
d540: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d550: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
d560: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
d570: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
d580: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
d590: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
d5a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
d5b0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
d5c0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d5f0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d600: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
d610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d620: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d630: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d640: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
d650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d660: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
d670: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
d680: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 72 65 61  /* True if a rea
d6b0: 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
d6c0: 67 65 20 69 73 20 6f 6b 20 2a 2f 0a 29 7b 0a 20  ge is ok */.){. 
d6d0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
d6e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d6f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d700: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  ) );..  if( pgno
d710: 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
d720: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
d730: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d740: 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
d750: 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
d760: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
d770: 70 70 50 61 67 65 2c 20 30 2c 20 62 52 65 61 64  ppPage, 0, bRead
d780: 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72  only);.    if( r
d790: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d7a0: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d7b0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d7c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d7d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d7e0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d7f0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d800: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d810: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d830: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d840: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d860: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d870: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d880: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d890: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d8a0: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d8b0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d8c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d8d0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d8e0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d8f0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d900: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d910: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d920: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d930: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d940: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d950: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d960: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d970: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d980: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d990: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d9a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d9b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d9c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d9d0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d9e0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d9f0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
da00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
da10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
da20: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
da30: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
da40: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
da50: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
da60: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
da70: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
da80: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
da90: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
daa0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
dab0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
dac0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
dad0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
dae0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
daf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
db00: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
db10: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
db20: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
db30: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
db40: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
db50: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
db60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
db70: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
db80: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
db90: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
dba0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
dbb0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
dbc0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
dbd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dbe0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dbf0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
dc00: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
dc10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dc20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dc30: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
dc40: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
dc50: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
dc60: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
dc70: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dc80: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
dc90: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
dca0: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
dcb0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
dcc0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
dcd0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
dce0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
dcf0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
dd00: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
dd10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
dd20: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
dd30: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
dd40: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
dd50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
dd60: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
dd70: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
dd80: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
dd90: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
dda0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
ddb0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
ddc0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
ddd0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
dde0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
ddf0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
de00: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
de10: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
de20: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
de30: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
de40: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
de60: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
de70: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
de80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
de90: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
dea0: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
deb0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
dec0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
ded0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
dee0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
def0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
df00: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
df10: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
df20: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
df30: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
df40: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
df50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
df60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
df70: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
df80: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
df90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
dfa0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
dfb0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
dfc0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
dfd0: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
dfe0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
dff0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
e000: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
e010: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
e020: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
e030: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
e040: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
e050: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
e060: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
e070: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
e080: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
e090: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
e0a0: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
e0b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
e0c0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
e0d0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
e0e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e0f0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
e100: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
e110: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
e120: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
e130: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
e140: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
e150: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
e160: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
e170: 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45  ts like.** BTREE
e180: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
e190: 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52  d/or BTREE_MEMOR
e1a0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
e1b0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
e1c0: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
e1d0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e1e0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
e1f0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
e200: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
e210: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
e220: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
e230: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
e240: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
e250: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
e260: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
e270: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
e280: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e290: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
e2a0: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
e2b0: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
e2c0: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
e2d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e2e0: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
e2f0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
e300: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e310: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
e320: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
e330: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e340: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
e350: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e360: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e370: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e380: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e390: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e3a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e3b0: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e3c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e3d0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e3e0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e3f0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e400: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e410: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e420: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e440: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e450: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e460: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e470: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e480: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e490: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e4a0: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e4b0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4d0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e4e0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e4f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e500: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e510: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e520: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e530: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e540: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e550: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e560: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e570: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e580: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e5a0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e5b0: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e5c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e5d0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e5e0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e5f0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e600: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e610: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e620: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e640: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e650: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e660: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e670: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e680: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e690: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e6a0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e6b0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e6c0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e6d0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e6e0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e6f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e700: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e710: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e720: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e730: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e740: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e750: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e760: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e790: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e7a0: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20  pInMemory(db)). 
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61        || (vfsFla
e7d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e7e0: 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
e7f0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
e800: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e810: 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61  ( pVfs!=0 );.  a
e820: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e830: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e840: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e850: 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d  ( (flags&0xff)==
e860: 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c  flags );   /* fl
e870: 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74  ags fit in 8 bit
e880: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  s */..  /* Only 
e890: 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  a BTREE_SINGLE d
e8a0: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42  atabase can be B
e8b0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a  TREE_UNORDERED *
e8c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
e8d0: 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44  gs & BTREE_UNORD
e8e0: 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61  ERED)==0 || (fla
e8f0: 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
e900: 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  E)!=0 );..  /* A
e910: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e920: 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73  tabase is always
e930: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64   a temporary and
e940: 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f  /or ephemeral */
e950: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e960: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e970: 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62  )==0 || isTempDb
e980: 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d   );..  if( isMem
e990: 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
e9a0: 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
e9b0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
e9c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e9d0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
e9e0: 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
e9f0: 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
ea00: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
ea10: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
ea20: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
ea30: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
ea40: 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  B;.  }.  p = sql
ea50: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
ea60: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
ea70: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
ea80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ea90: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
eaa0: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
eab0: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
eac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ead0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
eae0: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
eaf0: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
eb00: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
eb10: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
eb20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
eb30: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
eb40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eb50: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
eb60: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
eb70: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
eb80: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
eb90: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
eba0: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
ebb0: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
ebc0: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
ebd0: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
ebe0: 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
ebf0: 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
ec00: 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
ec10: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
ec20: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
ec30: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
ec40: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
ec50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
ec60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
ec70: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
ec80: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
ec90: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
eca0: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
ecb0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
ecc0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
ecd0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
ece0: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
ecf0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
ed00: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
ed10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
ed20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ed30: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
ed40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ed50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
ed60: 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
ed70: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
ed80: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
ed90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
eda0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
edb0: 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20  name)+1);.      
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
edd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
ede0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
edf0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
ee20: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
ee30: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ee40: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ee50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ee60: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ee70: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ee80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ee90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
eea0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
eeb0: 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
eec0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
eed0: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
eee0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
eef0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
ef00: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
ef10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ef20: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
ef30: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
ef40: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
ef50: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ef60: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
ef70: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
ef80: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ef90: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
efa0: 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
efb0: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
efc0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
efd0: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
efe0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
eff0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f000: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
f010: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
f020: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
f030: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
f040: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
f050: 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f070: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
f080: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
f090: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
f0a0: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
f0b0: 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
f0c0: 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
f0d0: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
f0e0: 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
f0f0: 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
f100: 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
f110: 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
f120: 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
f130: 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
f140: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f150: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f160: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
f170: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f180: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f190: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
f1a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f1b0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f1c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
f1d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f1e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
f1f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f200: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
f210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f230: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f240: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
f250: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
f260: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f290: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
f2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f2b0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f2c0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
f2d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
f2e0: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
f2f0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
f300: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
f310: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
f320: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
f330: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
f340: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
f350: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
f360: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
f370: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
f380: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
f390: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
f3a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f3b0: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
f3c0: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
f3d0: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
f3e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f3f0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
f400: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
f420: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
f430: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f440: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
f450: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
f460: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
f470: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
f480: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
f490: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
f4a0: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
f4b0: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
f4c0: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
f4d0: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
f4e0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
f4f0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
f510: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
f520: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
f530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f540: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
f550: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
f560: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f570: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
f580: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f590: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
f5a0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f5b0: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
f5c0: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
f5d0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
f5e0: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
f5f0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
f600: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
f620: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f630: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
f640: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
f650: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
f660: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
f670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f680: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
f690: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
f6a0: 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
f6b0: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
f6c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f6e0: 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
f6f0: 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
f700: 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
f710: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f720: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f730: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f740: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f750: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f760: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f770: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f780: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f7a0: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f7b0: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f7c0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f7d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f7e0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f7f0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f800: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f810: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f820: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f830: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f840: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f850: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
f860: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
f870: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
f880: 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
f890: 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
f8a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f8b0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
f8c0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
f8d0: 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
f8e0: 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
f8f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f900: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
f910: 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
f920: 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
f930: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f940: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
f950: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
f960: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
f970: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
f980: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
f990: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
f9a0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
f9b0: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
f9c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
f9d0: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
f9e0: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
f9f0: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
fa00: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
fa10: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
fa20: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
fa30: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
fa40: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
fa50: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
fa60: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
fa70: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
fa80: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
fa90: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
faa0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
fab0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
fac0: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
fad0: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
fae0: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
faf0: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
fb00: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
fb10: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
fb20: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
fb30: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
fb40: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
fb50: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
fb60: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
fb70: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
fb80: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
fb90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
fba0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
fbb0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
fbc0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
fbd0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fbe0: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
fbf0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
fc00: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
fc10: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
fc20: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
fc30: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
fc40: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
fc50: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
fc60: 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
fc70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fc80: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fc90: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
fca0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fcb0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
fcc0: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
fcd0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
fce0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
fcf0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
fd00: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
fd10: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fd20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
fd30: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
fd40: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
fd50: 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
fd60: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
fd70: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
fd80: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
fd90: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
fda0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
fdb0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
fdc0: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
fdd0: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
fde0: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
fdf0: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
fe00: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fe10: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fe20: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
fe30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
fe40: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
fe50: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
fe60: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
fe70: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
fe80: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
fe90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
fea0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
feb0: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
fec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
fed0: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
fee0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
fef0: 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  1;.      MUTEX_L
ff00: 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
ff10: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
ff20: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
ff30: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
ff40: 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
ff50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
ff60: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ff70: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ff80: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ff90: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ffa0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ffb0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
ffc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
ffd0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
ffe0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
fff0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10000 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
10010 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
10020 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
10030 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
10040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10060 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
10070 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
10080 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
10090 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
100a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
100b0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
100c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
100d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
100e0 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
100f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10100 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
10110 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
10120 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10130 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10140 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10150 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10160 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
10170 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
10180 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
10190 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
101a0 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
101b0 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
101c0 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
101d0 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
101e0 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
101f0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
10200 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
10210 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
10220 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
10230 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
10240 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
10250 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
10260 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10270 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
10280 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
10290 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
102a0 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
102b0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
102c0 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
102d0 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
102e0 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
102f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
10300 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
10310 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10320 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
10330 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
10340 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
10350 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10370 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
10380 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
10390 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
103a0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
103b0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
103c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
103d0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
103e0 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
103f0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
10400 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
10410 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
10420 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
10430 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
10440 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
10450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10460 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
10470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10490 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
104a0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
104b0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
104c0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
104d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
104e0 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
104f0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
10500 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10510 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10520 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10530 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
10540 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
10550 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
10560 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10570 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
10580 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
10590 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
105a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
105b0 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
105c0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
105d0 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
105e0 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
105f0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
10600 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
10610 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
10620 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
10630 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10640 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
10650 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
10660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10670 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
10680 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
10690 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
106a0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
106b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
106c0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
106d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
106e0 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
106f0 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
10700 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10710 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
10720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10730 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
10740 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10750 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
10760 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
10770 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
10780 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
10790 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
107a0 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
107b0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
107c0 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
107d0 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
107e0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
107f0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
10800 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
10810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10820 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
10830 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
10840 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10860 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
10870 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
10880 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
10890 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
108a0 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
108b0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
108c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
108d0 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
108e0 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
108f0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
10900 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10910 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10920 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
10930 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10940 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
10950 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
10960 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
10970 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
10980 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10990 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
109a0 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
109b0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
109c0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
109d0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
109e0 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
109f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
10a00 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
10a10 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10a20 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
10a30 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
10a40 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
10a50 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
10a60 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
10a70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
10a80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
10a90 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
10aa0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
10ab0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
10ac0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
10ad0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10ae0 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
10af0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10b00 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
10b10 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
10b20 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
10b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10b40 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
10b50 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
10b60 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
10b70 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
10b80 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
10b90 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
10ba0 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
10bb0 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
10bc0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
10bd0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10be0 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
10bf0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10c00 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
10c10 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
10c20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
10c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
10c40 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
10c50 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
10c60 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
10c70 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
10c80 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
10c90 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
10ca0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10cb0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
10cc0 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
10cd0 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
10ce0 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
10cf0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
10d00 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
10d10 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
10d20 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
10d30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10d40 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
10d50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10d60 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
10d70 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
10d80 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
10d90 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
10da0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
10db0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10dc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10dd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
10de0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10df0 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
10e00 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
10e10 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
10e20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
10e30 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
10e40 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
10e50 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
10e60 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
10e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10e80 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
10e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
10ea0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
10eb0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
10ec0 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
10ed0 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
10ee0 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
10ef0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10f00 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
10f10 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
10f20 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
10f30 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
10f40 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10f50 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  k(p, SQLITE_OK);
10f60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10f70 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
10f80 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
10f90 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
10fa0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
10fb0 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
10fc0 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
10fd0 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
10fe0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
10ff0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
11000 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
11010 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
11020 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11030 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
11040 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
11050 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
11060 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
11070 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11080 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
11090 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
110a0 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
110b0 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
110c0 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
110d0 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
110e0 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
110f0 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
11100 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
11110 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
11120 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
11130 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
11140 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
11150 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
11160 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
11170 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
11180 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
11190 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
111a0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
111b0 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
111c0 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
111d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
111e0 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
111f0 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
11200 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
11210 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
11220 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
11230 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11240 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
11250 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
11260 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11270 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
11280 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
11290 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
112a0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
112b0 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
112c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
112d0 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
112e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
112f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11310 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
11320 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
11330 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64  of pages allowed
11340 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
11350 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
11360 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   number of cache
11370 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f   pages is set to
11380 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a   the absolute.**
11390 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
113a0 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20  .  If mxPage is 
113b0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61  negative, the pa
113c0 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72  ger will.** oper
113d0 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73  ate asynchronous
113e0 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74  ly - it will not
113f0 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e   stop to do fsyn
11400 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72  c()s.** to insur
11410 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  e data is writte
11420 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  n to the disk su
11430 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20  rface before.** 
11440 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61  continuing.  Tra
11450 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
11460 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e  work if synchron
11470 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61  ous is off,.** a
11480 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
11490 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  cannot be corrup
114a0 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67  ted if this prog
114b0 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20  ram.** crashes. 
114c0 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72   But if the oper
114d0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61  ating system cra
114e0 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73  shes or there is
114f0 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f  .** an abrupt po
11500 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e  wer failure when
11510 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
11520 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73  off, the databas
11530 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65  e.** could be le
11540 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
11550 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f  stent and unreco
11560 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a  verable state..*
11570 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  * Synchronous is
11580 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73   on by default s
11590 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
115a0 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20  ption is not.** 
115b0 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79  normally a worry
115c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
115d0 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
115e0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
115f0 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
11600 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11610 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
11620 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11630 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
11640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11650 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
11660 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
11670 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11680 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
116a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
116b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
116c0 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
116d0 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
116e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
116f0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
11700 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
11710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11720 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
11730 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
11740 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
11750 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11760 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11770 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11780 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11790 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
117a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
117b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
117c0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
117d0 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
117e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
117f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11810 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11820 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11830 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11840 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11850 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11860 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11870 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11880 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11890 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
118a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
118b0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
118c0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
118d0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
118e0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
118f0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11900 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11910 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11920 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11930 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11940 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11950 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11960 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11970 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11980 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11990 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
119a0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
119b0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
119c0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
119d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
119e0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
119f0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11a00 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11a10 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11a30 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11a40 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11a50 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11a60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11a70 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
11a80 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
11a90 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
11aa0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
11ab0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
11ac0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
11ad0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
11ae0 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
11af0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11b00 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11b10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11b20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11b30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11b40 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11b50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11b60 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11b70 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
11b80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11b90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11ba0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
11bb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
11bc0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
11bd0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
11be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11c00 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11c20 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11c30 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11c40 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11c50 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11c60 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11c70 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11c80 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11c90 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
11ca0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
11cb0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
11cc0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11cd0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11ce0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11cf0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11d00 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11d10 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11d20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11d30 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11d40 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11d60 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11d70 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11d80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11db0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
11dc0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
11dd0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
11de0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
11df0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11e00 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11e10 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11e30 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11e40 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11e50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11e60 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11e70 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
11e80 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
11e90 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
11ea0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
11eb0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
11ec0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
11ed0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
11ee0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
11ef0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11f00 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11f10 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11f20 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11f30 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11f40 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11f50 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11f60 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11f70 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11f80 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11f90 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
11fa0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
11fb0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
11fc0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
11fd0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
11fe0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
11ff0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
12000 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
12010 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
12020 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
12030 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
12040 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
12050 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
12060 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
12070 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
12080 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
12090 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
120a0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
120b0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
120c0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
120d0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
120e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
120f0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
12100 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
12110 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
12120 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
12130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12140 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12150 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
12160 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
12170 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
12180 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
12190 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
121a0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
121b0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
121c0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
121d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
121e0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
121f0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12200 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
12210 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
12220 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
12230 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
12240 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
12250 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
12260 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
12270 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
12280 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
12290 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
122a0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
122b0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
122c0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
122d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
122e0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
122f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12300 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
12310 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
12320 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
12330 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
12340 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
12350 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
12360 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
12370 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12380 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12390 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
123a0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
123b0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
123c0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
123d0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
123e0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
123f0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
12400 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
12410 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12420 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12430 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12440 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
12450 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
12460 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
12470 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
12480 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
12490 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
124a0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
124b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
124c0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
124d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
124e0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
124f0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
12500 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12510 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
12520 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
12530 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
12540 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
12550 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
12560 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
12570 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
12580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
12590 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
125a0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
125b0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
125c0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
125d0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
125e0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
125f0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12600 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12610 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12620 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12630 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12640 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12650 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12660 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12670 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12680 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12690 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
126a0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
126b0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
126c0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
126d0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
126e0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
126f0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12700 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
12710 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12720 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12730 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
12740 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  ;.  return p->pB
12750 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12760 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12770 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12780 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c  LITE_HAS_CODEC |
12790 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  | SQLITE_DEBUG *
127a0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
127b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
127c0 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
127d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
127e0 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
127f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12800 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
12810 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12820 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12830 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12840 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12850 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12860 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12870 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12880 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12890 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
128a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
128b0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
128c0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
128d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
128e0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
128f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12900 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12920 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12930 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12940 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12950 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
12960 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
12970 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
12980 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
12990 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
129a0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
129b0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
129c0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
129d0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
129e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
129f0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12a00 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
12a10 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
12a20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12a30 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
12a40 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12a50 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
12a60 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
12a70 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
12a80 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12a90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12aa0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12ab0 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
12ac0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
12ad0 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
12ae0 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
12af0 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
12b00 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
12b10 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
12b20 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12b30 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
12b40 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
12b50 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
12b60 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12b70 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
12b80 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
12b90 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
12ba0 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
12bb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
12bc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12bd0 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
12be0 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
12bf0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
12c00 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
12c10 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
12c20 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
12c30 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
12c40 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
12c50 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
12c60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12c70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
12c80 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12c90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12ca0 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
12cb0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
12cc0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
12cd0 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
12ce0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12cf0 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
12d00 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
12d10 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12d20 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
12d30 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
12d40 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
12d50 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
12d60 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
12d70 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
12d80 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
12d90 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
12da0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
12db0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
12dc0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
12dd0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
12de0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
12df0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
12e00 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
12e10 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
12e20 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
12e30 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
12e40 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
12e50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12e60 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
12e70 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
12e80 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
12e90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12ea0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12eb0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
12ec0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
12ed0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ee0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
12ef0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12f00 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
12f10 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
12f20 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12f30 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12f40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
12f60 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
12f70 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
12f80 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12f90 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
12fa0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12fb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12fc0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12fd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12fe0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12ff0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
13000 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
13010 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
13020 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
13030 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
13040 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
13050 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
13060 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
13070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13080 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
13090 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
130a0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
130b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
130c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
130d0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
130e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
130f0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13100 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
13110 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
13120 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13130 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
13140 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
13150 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
13160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
13180 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
13190 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
131a0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
131b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
131c0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
131d0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
131e0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
131f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
13200 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
13210 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
13220 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
13230 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
13240 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
13250 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
13260 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
13270 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
13280 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
13290 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
132a0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
132b0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
132c0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
132d0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
132e0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
132f0 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
13300 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
13310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13320 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
13330 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
13340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
13350 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
13360 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13370 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
13380 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
13390 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
133a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
133b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
133c0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
133d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
133e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
133f0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13400 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
13410 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13420 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13430 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
13440 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
13450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13460 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13480 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
13490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
134a0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
134b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
134c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
134d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
134e0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
134f0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13500 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
13510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
13520 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
13530 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
13540 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
13550 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
13560 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
13570 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
13580 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
13590 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
135a0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
135b0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
135c0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
135d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
135e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
135f0 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
13600 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
13610 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
13620 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
13630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
13640 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
13650 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
13660 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
13670 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
13680 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
13690 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
136a0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
136b0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
136c0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
136d0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
136e0 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
136f0 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
13700 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13710 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13720 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
13730 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
13740 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
13750 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
13760 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
13770 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
13780 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
13790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
137a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
137b0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
137c0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
137d0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
137e0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
137f0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
13800 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13810 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
13820 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13830 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
13840 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
13850 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
13860 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
13870 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
13880 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
13890 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
138a0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
138b0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
138c0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
138d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
138e0 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
138f0 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
13900 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
13910 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
13920 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
13930 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
13940 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
13950 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
13960 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
13970 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
13980 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
13990 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
139a0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
139b0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
139c0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
139d0 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
139e0 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
139f0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
13a00 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13a10 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
13a20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
13a30 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
13a40 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
13a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13a60 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
13a70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
13a80 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
13a90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13aa0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13ab0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13ac0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
13ad0 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
13ae0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13af0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13b00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
13b20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13b30 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
13b40 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13b50 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
13b60 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
13b70 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
13b80 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
13b90 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13ba0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13bb0 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13bc0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13bd0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13be0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13bf0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13c00 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13c10 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
13c20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
13c30 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
13c40 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
13c50 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
13c60 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
13c70 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
13c80 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
13c90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13ca0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13cb0 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13cc0 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13cd0 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13ce0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13cf0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13d00 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13d10 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
13d20 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
13d30 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
13d40 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
13d50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13d60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
13d80 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13d90 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13da0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13db0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13dc0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13dd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13de0 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13df0 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13e00 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13e10 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
13e20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
13e30 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
13e40 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
13e50 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
13e60 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
13e70 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
13e80 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
13e90 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13ea0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13eb0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13ec0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13ee0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13ef0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13f00 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13f10 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
13f20 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
13f30 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
13f40 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13f50 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
13f60 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
13f70 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
13f80 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13f90 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13fa0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13fc0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13fd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13fe0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
14020 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
14030 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14040 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
14050 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
14060 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
14070 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
14080 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
14090 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
140a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
140b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
140c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
140d0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
140e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
140f0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14110 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
14120 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
14130 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
14140 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
14150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14160 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
14170 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
14180 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
14190 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
141a0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
141b0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
141c0 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
141d0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
141e0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
141f0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
14200 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
14210 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
14220 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
14230 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
14240 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
14250 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
14260 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
14270 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
14280 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
14290 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
142a0 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
142b0 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
142c0 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
142d0 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
142e0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
142f0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
14300 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
14310 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
14320 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
14330 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
14340 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
14350 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
14360 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
14370 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
14380 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
14390 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
143a0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
143b0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
143c0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
143d0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
143e0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
143f0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
14400 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
14410 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
14420 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
14430 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
14440 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14450 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
14460 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
14470 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
14480 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14490 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
144a0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
144b0 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
144c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
144d0 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
144e0 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
144f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14500 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
14510 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
14520 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
14530 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
14540 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
14550 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
14560 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
14570 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
14580 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14590 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
145a0 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
145b0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
145c0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
145d0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
145e0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
145f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
14600 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
14610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14620 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
14630 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
14640 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14650 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
14660 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14670 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
14680 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
14690 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
146a0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
146b0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
146c0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
146d0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
146e0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
146f0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
14700 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
14710 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
14720 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
14730 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
14740 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
14750 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
14760 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
14770 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
14780 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
14790 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
147a0 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
147b0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
147c0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75  the databse.  Cu
147d0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
147e0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
147f0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
14800 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
14810 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
14820 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
14830 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
14840 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
14850 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
14860 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
14870 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
14880 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
14890 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
148a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
148b0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
148c0 70 43 75 72 2d 3e 77 72 46 6c 61 67 29 20 26 26  pCur->wrFlag) &&
148d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
148e0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
148f0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
14900 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
14910 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
14920 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
14930 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
14940 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
14950 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
14960 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
14970 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
14980 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14990 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
149a0 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
149b0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
149c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
149d0 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
149e0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
149f0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
14a00 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
14a10 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
14a20 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
14a30 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
14a40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14a50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
14a60 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14a70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14a90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14aa0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
14ab0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
14ac0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
14ad0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
14ae0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
14af0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
14b00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
14b10 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
14b20 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
14b30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14b40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
14b50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14b60 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
14b70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
14b80 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
14b90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
14ba0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
14bb0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
14bc0 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
14bd0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
14be0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
14bf0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
14c00 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
14c10 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
14c20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
14c30 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
14c40 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
14c50 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
14c60 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
14c70 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
14c80 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
14c90 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14ca0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
14cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14cc0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
14cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14ce0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14cf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
14d00 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
14d10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14d20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14d30 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
14d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
14d50 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
14d60 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
14d70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
14d80 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
14d90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
14da0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
14db0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
14dc0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
14dd0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
14de0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
14df0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
14e00 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
14e10 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
14e20 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
14e30 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
14e40 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14e50 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
14e60 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
14e70 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
14e80 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
14e90 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
14ea0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
14eb0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
14ec0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
14ed0 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
14ee0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
14ef0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
14f00 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
14f10 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
14f20 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
14f30 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
14f40 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
14f50 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
14f60 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
14f70 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
14f80 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
14f90 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
14fa0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
14fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14fc0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14fd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
14fe0 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
14ff0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
15000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15010 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
15020 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
15030 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
15040 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
15050 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
15060 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
15070 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
15080 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
15090 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
150a0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
150b0 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
150c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
150d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
150e0 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
150f0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
15100 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
15110 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
15120 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
15130 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
15140 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
15150 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
15160 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
15170 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
15180 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
15190 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
151a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
151b0 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
151c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
151d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
151e0 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
151f0 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
15200 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
15210 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
15220 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15240 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
15250 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
15260 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
15270 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
15280 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
15290 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
152a0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
152b0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
152c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
152d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
152e0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
152f0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
15300 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
15310 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
15320 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
15330 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
15340 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
15350 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
15360 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
15370 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
15380 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
15390 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
153a0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
153b0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
153c0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
153d0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
153e0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
153f0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
15400 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
15410 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
15420 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
15430 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
15440 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
15450 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
15460 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
15470 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
15480 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
15490 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
154a0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
154b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
154c0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
154d0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
154e0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
154f0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
15500 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
15510 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
15520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
15530 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
15540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
15550 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
15560 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
15570 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15580 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
15590 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
155a0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
155b0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
155c0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
155d0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
155e0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
155f0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
15600 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
15610 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
15620 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
15630 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
15640 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
15650 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
15660 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
15670 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
15680 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
15690 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
156a0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
156b0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
156c0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
156d0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
156e0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
156f0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
15700 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
15710 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
15720 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
15730 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
15740 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
15750 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
15760 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
15770 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
15780 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
15790 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
157a0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
157b0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
157c0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
157d0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
157e0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
157f0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
15800 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
15810 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
15820 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
15830 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
15840 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
15850 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
15860 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
15870 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
15880 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
15890 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
158a0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
158b0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
158c0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
158d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
158e0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
158f0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
15900 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
15910 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
15920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15930 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15940 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15950 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15960 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
15970 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
15980 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
15990 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
159a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
159b0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
159c0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
159d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
159e0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
159f0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
15a00 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
15a10 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
15a20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
15a30 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
15a40 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
15a50 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
15a60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
15a70 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
15a80 20 61 73 73 65 72 74 28 20 49 66 4e 6f 74 4f 6d   assert( IfNotOm
15a90 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
15aa0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
15ab0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
15ac0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
15ad0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
15ae0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
15af0 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15b00 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15b10 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15b20 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15b30 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15b40 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15b50 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15b70 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15b80 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
15b90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
15ba0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
15bb0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
15bc0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
15bd0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
15be0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
15bf0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15c00 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15c10 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15c20 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15c40 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15c50 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15c60 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15c70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15c80 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
15c90 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
15ca0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
15cb0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
15cc0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
15cd0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
15ce0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
15cf0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15d00 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15d10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15d20 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15d30 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15d40 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15d50 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15d70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
15d80 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
15d90 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
15da0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
15db0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
15dc0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
15dd0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
15de0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
15df0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15e00 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
15e10 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
15e20 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
15e30 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
15e40 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
15e50 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
15e60 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
15e70 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
15e80 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
15e90 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
15ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
15eb0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
15ec0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
15ed0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
15ee0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
15ef0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
15f00 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
15f10 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
15f20 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
15f30 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
15f40 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
15f50 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15f60 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
15f70 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
15f80 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
15f90 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
15fa0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
15fb0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
15fc0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
15fd0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
15fe0 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
15ff0 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
16000 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
16010 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
16020 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
16030 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
16040 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
16050 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
16060 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
16070 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
16080 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
16090 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
160a0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
160b0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
160c0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
160d0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
160e0 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
160f0 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
16100 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
16110 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
16120 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
16130 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
16140 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
16150 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
16160 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
16170 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16180 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
16190 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
161a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
161b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
161c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
161d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
161e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
161f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16200 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
16210 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
16220 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
16230 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
16240 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16250 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16260 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
16270 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
16280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16290 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
162a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
162b0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
162c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
162d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
162e0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
162f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
16300 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16310 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
16320 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
16330 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
16340 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
16350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16360 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
16370 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
16380 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
16390 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
163a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
163b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
163c0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
163d0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
163e0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
163f0 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
16400 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
16410 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
16420 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
16430 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
16440 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
16450 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
16460 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
16470 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
16480 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
16490 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
164a0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
164b0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
164c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
164d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
164e0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
164f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16500 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
16510 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
16520 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
16530 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
16540 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
16550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16560 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
16570 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
16580 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
16590 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
165a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
165b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
165c0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
165d0 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
165e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
165f0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
16600 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
16610 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
16620 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
16630 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
16640 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
16650 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
16660 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
16670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16680 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
16690 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
166a0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
166b0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
166c0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
166d0 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
166e0 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
166f0 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
16700 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
16710 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
16720 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
16730 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
16740 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
16750 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
16760 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
16770 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
16780 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
16790 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
167a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
167b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
167c0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
167d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
167e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
167f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16800 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
16810 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
16820 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16840 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
16850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16860 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
16870 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
16880 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
16890 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
168a0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
168b0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
168c0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
168d0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
168e0 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
168f0 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
16900 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
16910 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
16920 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
16930 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
16940 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
16950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16960 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
16970 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
16980 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
16990 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
169a0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
169b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
169c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
169d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
169e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
169f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
16a00 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
16a10 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
16a20 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
16a30 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
16a40 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
16a50 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
16a60 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
16a70 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
16a80 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
16a90 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
16aa0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
16ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16ac0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
16ad0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
16ae0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
16b10 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
16b20 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
16b50 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
16b60 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16b90 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
16ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
16bb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
16bc0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
16bd0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
16be0 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
16bf0 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
16c00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16c10 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
16c20 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
16c30 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
16c40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
16c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16c60 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
16c70 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
16c80 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
16c90 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
16ca0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
16cb0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
16cc0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
16cd0 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
16ce0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
16cf0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
16d00 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
16d10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
16d20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
16d30 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
16d40 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
16d50 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16d60 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16d70 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
16d80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
16d90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16da0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
16db0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
16dc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16dd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
16de0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
16df0 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
16e00 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
16e10 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
16e20 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
16e30 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
16e40 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
16e50 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
16e60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
16e70 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
16e80 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
16e90 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
16ea0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
16eb0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
16ec0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
16ed0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
16ee0 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
16ef0 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
16f00 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
16f10 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
16f20 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
16f30 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
16f40 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16f50 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
16f60 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
16f70 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
16f80 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
16f90 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
16fa0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
16fb0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
16fc0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
16fd0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
17000 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
17010 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
17020 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17030 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
17040 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
17050 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17060 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
17070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17080 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
17090 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
170a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
170b0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
170c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
170d0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
170e0 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
170f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17100 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
17110 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
17120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17130 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
17140 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
17150 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
17160 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17170 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
17180 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
17190 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
171a0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
171b0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
171c0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
171d0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
171e0 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
171f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
17220 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17230 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
17240 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
17250 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
17260 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
17270 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
17280 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
17290 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
172a0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
172b0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
172c0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
172d0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
172e0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
172f0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
17300 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17310 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
17320 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
17330 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
17340 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
17350 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
17360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17370 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
17380 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
17390 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
173a0 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
173b0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
173c0 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
173d0 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
173e0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
173f0 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
17400 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
17410 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17420 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
17430 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
17460 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
17470 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
17480 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17490 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
174a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
174b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
174c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
174d0 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
174e0 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
174f0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
17500 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
17510 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17520 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17530 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
17540 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17560 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
17570 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17580 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
17590 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
175a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
175b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
175c0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
175d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
175e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
175f0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
17600 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
17610 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
17620 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
17630 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
17640 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
17650 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
17660 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
17670 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
17680 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
17690 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
176a0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
176b0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
176c0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
176d0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
176e0 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
176f0 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
17700 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
17710 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
17720 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
17730 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
17740 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
17750 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
17760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17770 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
17780 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
17790 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
177a0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
177b0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
177c0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
177d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
177e0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
177f0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
17800 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
17810 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
17820 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
17830 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
17840 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
17850 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
17860 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
17870 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
17880 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
17890 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
178a0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
178b0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
178c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
178d0 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
178e0 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
178f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
17900 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
17910 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
17920 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
17930 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
17940 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
17950 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
17960 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
17970 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
17980 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17990 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
179a0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
179b0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
179c0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
179d0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
179e0 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
179f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17a00 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
17a20 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
17a30 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
17a40 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
17a50 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
17a60 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
17a70 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
17a80 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
17a90 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
17aa0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
17ab0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
17ac0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
17ad0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17ae0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
17af0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
17b00 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17b10 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
17b20 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
17b30 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
17b40 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
17b50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17b70 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
17b80 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
17b90 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
17ba0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
17bb0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
17bc0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
17bd0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
17be0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
17bf0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
17c00 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
17c10 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
17c20 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
17c30 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
17c40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
17c50 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
17c60 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
17c70 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
17c80 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
17c90 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
17ca0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
17cb0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
17cc0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
17cd0 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
17ce0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
17cf0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
17d00 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
17d10 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
17d20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
17d30 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
17d40 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
17d50 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
17d60 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
17d70 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
17d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
17db0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
17dc0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
17dd0 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
17de0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
17df0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
17e00 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17e10 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
17e20 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
17e30 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
17e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17e70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
17e80 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
17e90 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
17ea0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
17eb0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
17ec0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
17ed0 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
17ee0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
17ef0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
17f00 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
17f10 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
17f20 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
17f30 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
17f40 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
17f50 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
17f60 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
17f70 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
17f80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17fc0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
17fd0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
17fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17ff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18000 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
18010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18020 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
18030 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
18040 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
18050 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
18060 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
18070 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
18080 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
180a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
180b0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
180c0 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
180d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
180e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
180f0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
18100 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
18110 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
18120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
18130 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
18140 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
18150 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
18160 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
18170 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
18180 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
18190 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
181a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
181b0 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
181c0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
181d0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
181e0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
181f0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
18200 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
18210 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
18220 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
18230 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
18240 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
18250 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
18260 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
18270 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
18280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18290 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
182a0 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
182b0 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
182c0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
182d0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
182e0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
182f0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
18300 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
18310 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
18320 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
18330 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
18340 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
18350 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
18360 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
18370 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
18380 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
18390 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
183a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
183b0 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
183c0 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
183d0 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
183e0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
183f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
18400 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
18410 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
18420 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
18430 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
18440 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
18450 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
18460 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
18470 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
18480 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
18490 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
184a0 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
184b0 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
184c0 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
184d0 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
184e0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
184f0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
18500 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18510 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
18520 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
18530 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
18540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18550 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18560 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18570 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
18580 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
18590 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
185a0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
185b0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
185c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
185d0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
185e0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
185f0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
18600 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
18610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18620 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
18630 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
18640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
18650 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
18660 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
18670 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
18680 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
18690 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
186a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
186c0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
186d0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
186e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
186f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18700 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18710 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18720 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
18730 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
18740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
18750 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
18760 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
18770 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
18780 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
18790 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
187a0 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
187b0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
187c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
187d0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
187e0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
187f0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
18800 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
18810 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
18820 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
18830 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
18840 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
18850 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
18860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18870 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
18880 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
18890 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
188a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
188b0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
188c0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
188d0 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
188e0 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
188f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18900 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
18930 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
18940 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
18950 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
18960 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
18970 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
18980 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
18990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
189a0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
189b0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
189c0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
189d0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
189e0 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
189f0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
18a00 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
18a10 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
18a20 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
18a30 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
18a40 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
18a50 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
18a60 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
18a70 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
18a80 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
18a90 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
18aa0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 2c 20  g, &pLastPg, 0, 
18ab0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
18ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18ae0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18af0 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
18b00 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
18b10 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
18b20 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
18b30 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
18b40 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
18b50 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
18b60 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
18b70 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
18b80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
18b90 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
18ba0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
18bb0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
18bc0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
18bd0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
18be0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
18bf0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
18c00 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
18c10 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
18c20 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
18c30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18c40 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
18c50 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
18c60 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
18c70 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
18c80 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
18c90 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
18ca0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
18cb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
18cc0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
18cd0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
18ce0 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
18cf0 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
18d00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18d20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
18d30 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
18d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
18d60 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18d70 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
18d80 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
18d90 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
18da0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
18db0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
18dc0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
18dd0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
18de0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
18df0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
18e00 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
18e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18e20 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
18e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18e50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18e70 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
18e80 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
18e90 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
18ea0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
18eb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18ec0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
18ed0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18ee0 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
18ef0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
18f00 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
18f10 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
18f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18f30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
18f40 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
18f50 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
18f60 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
18f70 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
18f80 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
18f90 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
18fa0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
18fb0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
18fc0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
18fd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18fe0 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
18ff0 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
19000 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
19010 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
19020 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
19030 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
19040 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
19050 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19080 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
19090 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
190a0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
190d0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
190e0 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
190f0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
19100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19110 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
19120 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
19130 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
19140 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
19150 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
19160 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
19170 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
19180 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
19190 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
191a0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
191b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
191c0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
191d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
191e0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
191f0 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
19200 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19210 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
19220 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
19230 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
19240 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
19250 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
19260 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
19270 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
19280 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
19290 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
192a0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
192b0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
192c0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
192d0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
192e0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
192f0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
19300 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
19310 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
19320 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
19330 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
19340 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
19350 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
19360 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
19370 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
19380 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19390 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
193a0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
193b0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
193c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
193d0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
193e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
193f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19400 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
19410 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19420 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19430 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19440 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
19450 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19460 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
19470 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
19480 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19490 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
194a0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
194b0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
194c0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
194d0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
194e0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
194f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
19500 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
19510 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
19520 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
19530 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
19540 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19550 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19560 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
19570 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
19580 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
19590 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
195a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
195b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
195c0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
195d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
195e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
195f0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
19600 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
19610 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
19620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19650 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19660 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19670 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
19680 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
19690 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
196a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
196b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
196c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
196d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
196e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
196f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19700 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19710 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19720 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
19730 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
19740 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
19750 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
19760 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
19770 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
19780 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
19790 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
197a0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
197b0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
197c0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
197d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
197e0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
197f0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
19800 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
19810 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
19820 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
19830 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
19840 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
19850 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
19860 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
19870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
19880 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
19890 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
198a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
198b0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
198c0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
198d0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
198e0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
198f0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19900 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
19910 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19920 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19930 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
19940 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
19950 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
19960 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
19970 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
19980 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
19990 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
199a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
199b0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
199c0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
199d0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
199e0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
199f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19a00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
19a10 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
19a20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
19a30 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
19a40 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
19a50 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
19a60 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
19a70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
19a80 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
19a90 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
19aa0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
19ab0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
19ac0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
19ad0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
19ae0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19af0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19b00 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
19b10 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
19b20 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
19b30 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
19b40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
19b50 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
19b60 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
19b70 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
19b80 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
19b90 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
19ba0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
19bb0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
19bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19be0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19bf0 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
19c00 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
19c10 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
19c20 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
19c30 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
19c40 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
19c50 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
19c60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19c70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19c80 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
19c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
19ca0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
19cb0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
19cc0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
19cd0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
19ce0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
19cf0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
19d00 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
19d10 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
19d20 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
19d30 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
19d40 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
19d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
19d60 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
19d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19d80 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
19d90 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
19da0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19db0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19dc0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
19dd0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
19de0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19df0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
19e00 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19e10 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
19e20 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
19e30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
19e40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
19e50 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
19e60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19e80 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19e90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19ea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
19eb0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
19ec0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
19ed0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
19ee0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
19ef0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
19f00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
19f10 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
19f20 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
19f30 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
19f40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19f50 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
19f60 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
19f70 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
19f80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
19f90 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
19fa0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
19fb0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
19fc0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
19fd0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
19fe0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
19ff0 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1a000 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1a010 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1a020 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1a030 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1a040 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1a050 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1a060 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1a070 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1a080 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a090 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1a0a0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1a0b0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1a0c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1a0d0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1a0e0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1a0f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1a100 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a120 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1a130 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1a140 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1a150 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1a160 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1a170 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1a180 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1a190 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1a1a0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1a1b0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1a1c0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1a1d0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1a1e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1a1f0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1a200 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1a210 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1a220 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1a230 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1a240 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1a250 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1a260 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1a270 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1a280 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1a290 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1a2a0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1a2b0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1a2c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1a2d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a2e0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1a2f0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1a300 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1a310 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1a320 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1a330 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1a340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1a350 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1a360 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1a370 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1a380 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1a390 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1a3a0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1a3b0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1a3c0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1a3d0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1a3e0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1a3f0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1a400 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1a410 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1a420 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1a430 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1a440 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1a450 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1a460 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1a470 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1a480 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1a490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a4a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1a4b0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1a4c0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1a4d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a4e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1a4f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a500 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1a510 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a520 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1a530 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1a540 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a550 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a560 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1a570 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1a580 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1a590 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1a5a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a5b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1a5c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a5d0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1a5e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1a5f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1a600 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1a610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1a620 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1a630 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1a640 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1a650 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1a660 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a670 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1a680 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1a690 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a6a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a6b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1a6d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1a6e0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1a6f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1a700 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1a710 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1a720 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1a730 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1a740 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1a750 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1a760 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1a770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a780 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1a790 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1a7a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1a7b0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1a7c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1a7d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a7e0 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1a7f0 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1a800 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1a810 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1a820 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1a830 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1a840 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1a850 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1a860 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1a870 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1a880 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1a890 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1a8a0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1a8b0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1a8c0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
1a8d0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
1a8e0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1a8f0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
1a900 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
1a910 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1a920 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
1a930 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
1a940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a950 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1a960 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
1a970 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1a980 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
1a990 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1a9a0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
1a9b0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
1a9c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a9d0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
1a9e0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
1a9f0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1aa00 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
1aa10 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
1aa20 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
1aa30 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
1aa40 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
1aa50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1aa60 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
1aa70 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
1aa80 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
1aa90 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1aaa0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1aab0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
1aac0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
1aad0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1aae0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1aaf0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
1ab00 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1ab10 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1ab20 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1ab30 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
1ab40 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
1ab50 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
1ab60 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
1ab70 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
1ab80 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
1ab90 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
1aba0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
1abb0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
1abc0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1abd0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1abe0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1abf0 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1ac00 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1ac10 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1ac20 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1ac30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ac40 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1ac50 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1ac60 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1ac70 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1ac80 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ac90 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1aca0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1acb0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1acc0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1acd0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1ace0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1acf0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1ad00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1ad10 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1ad20 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1ad30 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1ad40 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1ad50 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1ad60 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1ad70 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1ad80 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1ad90 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1ada0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1adb0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1adc0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1add0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1ade0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1adf0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ae00 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1ae10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ae20 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1ae30 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1ae40 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1ae50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1ae60 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1ae70 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1ae80 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1ae90 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1aea0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1aeb0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1aec0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1aed0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1aee0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1aef0 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1af00 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1af10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1af20 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1af30 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1af40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1af50 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1af60 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1af70 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1af80 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1af90 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1afa0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1afb0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1afc0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1afd0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1afe0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1aff0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1b000 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1b010 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1b020 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1b030 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1b040 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1b050 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1b060 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1b070 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1b080 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1b090 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1b0a0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1b0b0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1b0c0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1b0d0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1b0e0 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1b0f0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1b100 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1b110 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1b120 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b130 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1b140 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1b150 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1b160 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1b170 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1b180 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b190 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1b1a0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1b1b0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1b1c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1b1d0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1b1e0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1b1f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b200 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1b210 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b220 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1b230 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1b240 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1b250 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1b260 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1b270 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1b280 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1b290 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1b2a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b2b0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1b2c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1b2d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1b2e0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1b2f0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b300 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b310 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1b320 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1b330 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1b340 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1b350 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1b360 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1b370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b380 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1b390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1b3a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b3b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b3c0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1b3d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1b3e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1b3f0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1b400 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1b410 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1b420 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1b430 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b450 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1b460 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1b470 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1b480 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1b490 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1b4a0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1b4b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b4c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b4d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1b4e0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1b4f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b510 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b520 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1b530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b540 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1b560 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1b570 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1b580 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1b590 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1b5a0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1b5b0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1b5c0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1b5d0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1b5e0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1b5f0 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1b600 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1b610 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1b620 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1b630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1b640 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1b650 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1b660 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1b670 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1b680 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1b690 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1b6a0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1b6b0 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1b6c0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1b6d0 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1b6e0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1b6f0 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1b700 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1b710 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1b720 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1b730 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1b740 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1b750 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1b760 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1b770 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1b780 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1b790 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1b7a0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1b7b0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1b7c0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1b7d0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1b7e0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1b7f0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1b800 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1b810 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1b820 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b830 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b840 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1b850 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1b860 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b870 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1b880 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1b890 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1b8a0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1b8b0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1b8c0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1b8d0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1b8e0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1b8f0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1b900 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1b910 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1b920 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1b930 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1b940 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b950 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1b960 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1b970 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1b980 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1b990 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1b9a0 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1b9b0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1b9c0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1b9d0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1b9e0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1b9f0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ba00 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1ba10 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1ba20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1ba30 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1ba40 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1ba50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ba60 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1ba70 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1ba80 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1ba90 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1baa0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1bab0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bac0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1bad0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1bae0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1baf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bb00 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1bb10 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1bb20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bb30 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1bb40 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1bb50 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1bb60 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1bb70 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1bb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1bb90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1bba0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1bbb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1bbc0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1bbd0 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1bbe0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1bbf0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1bc00 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bc10 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1bc20 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1bc30 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1bc40 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1bc50 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1bc60 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1bc70 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1bc80 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1bc90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bca0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1bcb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1bcc0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1bcd0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1bce0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1bcf0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1bd00 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1bd10 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1bd20 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1bd30 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1bd40 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1bd50 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1bd60 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1bd70 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1bd80 20 30 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f   0, 0)==SQLITE_O
1bd90 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
1bda0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1bdb0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
1bdc0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
1bdd0 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
1bde0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
1bdf0 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
1be00 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1be10 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
1be20 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
1be30 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
1be40 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
1be50 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
1be60 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
1be70 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
1be80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1be90 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1bea0 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
1beb0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1bec0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1bed0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1bee0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1bef0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1bf00 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1bf10 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1bf20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1bf30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bf40 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
1bf50 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1bf60 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1bf70 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
1bf80 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1bf90 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1bfa0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1bfb0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1bfc0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1bfd0 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1bfe0 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1bff0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1c000 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1c010 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1c020 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1c030 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1c040 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1c050 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1c060 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1c070 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1c080 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1c090 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1c0a0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1c0b0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1c0c0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1c0d0 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1c0e0 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1c0f0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1c100 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1c110 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1c120 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1c130 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1c140 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1c150 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1c160 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1c170 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1c180 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1c190 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1c1a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1c1b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1c1c0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1c1d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1c1e0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1c1f0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1c200 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1c210 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1c220 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1c230 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1c240 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1c250 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1c260 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1c270 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1c280 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1c290 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1c2a0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1c2b0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1c2c0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c2d0 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1c2e0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1c2f0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1c300 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1c310 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1c320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c330 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1c340 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1c350 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1c360 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1c370 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1c380 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1c390 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1c3a0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c3b0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c3c0 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1c3d0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1c3e0 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1c3f0 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1c400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1c410 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1c420 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1c430 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1c440 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1c450 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1c460 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1c470 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1c480 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1c490 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1c4a0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1c4b0 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1c4c0 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1c4d0 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1c4e0 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1c4f0 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1c500 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1c510 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1c520 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1c530 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1c540 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1c550 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1c560 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1c570 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1c580 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1c590 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1c5a0 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1c5b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c5c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c5d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c5e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1c5f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1c600 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1c610 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1c620 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1c630 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1c640 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1c650 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1c660 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1c670 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1c680 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1c690 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1c6a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1c6b0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1c6c0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1c6d0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1c6e0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1c6f0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1c700 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1c710 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1c720 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1c730 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1c740 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1c750 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1c760 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1c770 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1c780 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1c790 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1c7a0 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1c7b0 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1c7c0 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1c7d0 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1c7e0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1c7f0 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1c800 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1c810 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1c820 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1c830 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1c840 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1c850 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1c860 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1c870 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c880 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1c890 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1c8a0 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1c8b0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1c8c0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1c8d0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1c8e0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1c8f0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1c900 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1c910 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1c920 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1c930 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1c940 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1c950 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1c960 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1c970 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1c980 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1c9a0 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1c9b0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1c9c0 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1c9d0 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1c9e0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1c9f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1ca00 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1ca10 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1ca20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1ca30 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1ca40 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1ca50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1ca60 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1ca70 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1ca80 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1ca90 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1caa0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1cab0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1cac0 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1cad0 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1cae0 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1caf0 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1cb00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cb10 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1cb20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cb30 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cb40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cb50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1cb60 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1cb70 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1cb80 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1cb90 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1cba0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1cbb0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1cbc0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1cbd0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1cbe0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1cbf0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1cc00 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1cc10 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1cc20 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1cc30 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1cc40 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1cc50 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1cc60 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1cc70 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1cc80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1cc90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1cca0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1ccb0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1ccc0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1ccd0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1cce0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1ccf0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1cd00 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1cd10 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1cd20 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1cd30 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1cd40 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1cd50 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1cd60 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1cd70 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1cd80 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1cd90 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1cda0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1cdb0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1cdc0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1cdd0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1cde0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1cdf0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ce00 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1ce10 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1ce20 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1ce30 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1ce40 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1ce50 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1ce60 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1ce70 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1ce80 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1ce90 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1cea0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1ceb0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1cec0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1ced0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1cee0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1cef0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1cf00 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1cf10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1cf20 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1cf30 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1cf40 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1cf50 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1cf60 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1cf70 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1cf80 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1cf90 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1cfa0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1cfb0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1cfc0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1cfd0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1cfe0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1cff0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1d000 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1d010 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1d020 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1d030 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1d040 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1d050 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1d060 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1d070 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1d080 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1d090 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1d0a0 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1d0b0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1d0c0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1d0d0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1d0e0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d110 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1d120 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1d150 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1d160 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1d170 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d190 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1d1a0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1d1b0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1d1c0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1d1d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1d1e0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1d1f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1d200 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d220 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1d230 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1d240 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1d250 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1d260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d270 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1d280 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1d290 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1d2a0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1d2b0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1d2c0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1d2d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1d2e0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1d2f0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1d300 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1d310 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1d320 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1d330 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1d340 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1d350 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1d360 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1d370 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1d380 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1d390 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1d3a0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1d3b0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1d3c0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d3d0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1d3e0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1d3f0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1d400 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1d410 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1d420 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1d430 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1d440 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1d450 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1d460 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1d470 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1d480 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1d490 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1d4a0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1d4b0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d4c0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1d4d0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1d4e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1d4f0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1d500 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1d510 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1d520 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1d530 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1d540 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
1d550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1d560 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1d570 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
1d580 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1d590 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
1d5a0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
1d5b0 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
1d5c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
1d5d0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
1d5e0 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
1d5f0 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
1d600 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
1d610 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
1d620 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
1d630 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
1d640 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
1d650 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1d660 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
1d670 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
1d680 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1d690 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1d6a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
1d6b0 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
1d6c0 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
1d6d0 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
1d6e0 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
1d6f0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
1d700 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
1d710 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
1d720 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1d730 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
1d740 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
1d750 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1d760 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1d770 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
1d780 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  owid = 0;.  retu
1d790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d7a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d7b0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1d7c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1d7f0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1d800 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1d830 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1d840 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1d850 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1d880 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1d890 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1d8a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d8c0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
1d8d0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
1d8e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1d910 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
1d920 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1d930 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1d940 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1d950 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
1d960 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
1d970 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1d980 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d990 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d9a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d9b0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1d9c0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
1d9d0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
1d9e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
1d9f0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
1da00 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
1da10 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
1da20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
1da30 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
1da40 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
1da50 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
1da60 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
1da70 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
1da80 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
1da90 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
1daa0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
1dab0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
1dac0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
1dad0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1dae0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
1daf0 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
1db00 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
1db10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1db20 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
1db30 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
1db40 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
1db50 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
1db60 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
1db70 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
1db80 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
1db90 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
1dba0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
1dbb0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
1dbc0 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
1dbd0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
1dbe0 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
1dbf0 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
1dc00 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
1dc10 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
1dc20 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
1dc30 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
1dc40 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
1dc50 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
1dc60 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
1dc70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1dc80 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
1dc90 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
1dca0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
1dcb0 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
1dcc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1dcd0 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76  e cached rowid v
1dce0 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75  alue of every cu
1dcf0 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65  rsor in the same
1dd00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1dd10 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61  * as pCur and ha
1dd20 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f  ving the same ro
1dd30 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ot page number a
1dd40 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c  s pCur.  The val
1dd50 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
1dd60 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  iRowid..**.** On
1dd70 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69  ly positive rowi
1dd80 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  d values are con
1dd90 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f  sidered valid fo
1dda0 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a  r this cache..**
1ddb0 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   The cache is in
1ddc0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1ddd0 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  o, indicating an
1dde0 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a   invalid cache..
1ddf0 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20  ** A btree will 
1de00 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a  work fine with z
1de10 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1de20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74  rowids.  We just
1de30 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65   cannot.** cache
1de40 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1de50 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20  e rowids, which 
1de60 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61  means tables tha
1de70 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a  t use zero or.**
1de80 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1de90 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
1dea0 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74  tle slower.  But
1deb0 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65   in practice, ze
1dec0 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76  ro.** or negativ
1ded0 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72  e rowids are ver
1dee0 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68  y uncommon so th
1def0 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
1df00 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
1df10 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1df20 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  SetCachedRowid(B
1df30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73  tCursor *pCur, s
1df40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
1df50 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  wid){.  BtCursor
1df60 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75   *p;.  for(p=pCu
1df70 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  r->pBt->pCursor;
1df80 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1df90 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
1dfa0 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  Root==pCur->pgno
1dfb0 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64  Root ) p->cached
1dfc0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1dfd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1dfe0 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d  ur->cachedRowid=
1dff0 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a  =iRowid );.}../*
1e000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1e010 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20  ached rowid for 
1e020 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
1e030 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72  .  A negative or
1e040 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20   zero.** return 
1e050 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
1e060 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63  that the rowid c
1e070 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20  ache is invalid 
1e080 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  and should be.**
1e090 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68   ignored.  If th
1e0a0 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61  e rowid cache ha
1e0b0 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
1e0c0 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a  een set, then a.
1e0d0 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  ** zero is retur
1e0e0 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
1e0f0 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72  int64 sqlite3Btr
1e100 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeGetCachedRowid
1e110 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e120 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  {.  return pCur-
1e130 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a  >cachedRowid;.}.
1e140 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1e150 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
1e160 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1e170 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1e180 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
1e190 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
1e1a0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
1e1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1e1c0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
1e1d0 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
1e1e0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
1e1f0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
1e200 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
1e210 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
1e220 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1e230 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1e240 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1e260 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1e270 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
1e280 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
1e290 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
1e2a0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
1e2b0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
1e2c0 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
1e2d0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
1e2e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e2f0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1e300 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
1e310 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
1e320 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
1e330 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
1e340 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1e350 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e360 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1e370 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
1e380 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1e390 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61  d(pBt);.    inva
1e3a0 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1e3b0 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f  che(pCur);.    /
1e3c0 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1e3d0 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1e3e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e3f0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1e400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e410 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1e420 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1e430 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1e440 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1e450 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1e460 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1e470 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1e480 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1e490 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
1e4a0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1e4b0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1e4c0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1e4d0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1e4e0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1e4f0 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1e500 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1e510 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1e520 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
1e530 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1e540 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1e550 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1e560 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1e570 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1e580 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1e590 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1e5a0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1e5b0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1e5c0 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1e5d0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1e5e0 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1e5f0 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1e600 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1e610 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1e620 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1e630 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1e640 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1e650 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1e660 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1e670 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1e680 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1e690 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1e6a0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1e6b0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1e6c0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1e6d0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1e6e0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1e6f0 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1e700 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1e710 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e720 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1e730 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1e740 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1e750 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1e760 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1e770 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1e780 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1e790 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1e7a0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1e7b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1e7c0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
1e7d0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
1e7e0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
1e7f0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
1e800 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
1e810 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
1e820 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
1e830 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
1e840 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
1e850 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1e860 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
1e870 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
1e880 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
1e890 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1e8a0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
1e8b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1e8c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
1e8d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1e8e0 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  e;.      btreePa
1e8f0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1e900 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1e910 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1e920 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
1e930 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1e940 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
1e950 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1e960 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1e970 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1e980 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1e990 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1e9a0 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1e9b0 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1e9c0 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1e9d0 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1e9e0 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1e9f0 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ea30 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1ea40 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1ea90 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1eae0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1eaf0 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1eb00 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1eb10 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
1eb20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1eb30 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1eb70 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ebc0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1ebd0 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ec10 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
1ec20 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64  SC_VER */..#ifnd
1ec30 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
1ec40 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
1ec50 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1ec60 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1ec70 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
1ec80 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1ec90 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
1eca0 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
1ecb0 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
1ecc0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
1ecd0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
1ece0 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
1ecf0 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
1ed00 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
1ed10 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
1ed20 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
1ed30 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1ed40 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
1ed50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ed60 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
1ed70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1ed80 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
1ed90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1eda0 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
1edb0 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  f /* NDEBUG */..
1edc0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1edd0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1ede0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
1edf0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
1ee00 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
1ee10 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
1ee20 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
1ee30 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1ee40 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
1ee50 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
1ee60 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1ee70 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
1ee80 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
1ee90 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
1eea0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1eeb0 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
1eec0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
1eed0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1eee0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1eef0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ef00 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72  position the cur
1ef10 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  sor prior to inv
1ef20 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1ef30 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ne..** .** This 
1ef40 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1ef50 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20  ail.  It always 
1ef60 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1ef70 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  K.  .*/.int sqli
1ef80 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1ef90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1efa0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  i64 *pSize){.  a
1efb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1efc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1efd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1efe0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1eff0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1f000 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f010 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
1f020 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
1f030 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1f040 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d   *pSize = 0;.  }
1f050 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c  else{.    getCel
1f060 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1f070 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1f080 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
1f090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f0a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
1f0b0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
1f0c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1f0d0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
1f0e0 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
1f0f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1f100 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
1f110 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
1f120 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
1f130 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1f140 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
1f150 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
1f160 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1f170 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
1f180 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
1f190 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
1f1a0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
1f1b0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
1f1c0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
1f1d0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
1f1e0 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66  ossible.  This f
1f1f0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
1f200 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1f210 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75  ..** It might ju
1f220 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20  st as well be a 
1f230 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72  procedure (retur
1f240 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77  ning void) but w
1f250 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f  e continue.** to
1f260 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
1f270 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66  er result code f
1f280 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65  or historical re
1f290 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  asons..*/.int sq
1f2a0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
1f2b0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
1f2c0 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
1f2d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f2e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f2f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f300 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f310 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
1f320 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1f330 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
1f340 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1f350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1f370 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1f380 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
1f390 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1f3a0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
1f3b0 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
1f3c0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
1f3d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1f3e0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1f3f0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
1f400 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
1f410 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
1f420 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
1f430 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
1f440 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
1f450 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
1f460 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
1f470 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
1f480 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
1f490 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1f4a0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
1f4b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1f4c0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
1f4d0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
1f4e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1f4f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1f500 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
1f510 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
1f520 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
1f530 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
1f540 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1f550 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
1f560 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
1f570 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1f580 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
1f590 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
1f5a0 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
1f5b0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
1f5c0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
1f5d0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
1f5e0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
1f5f0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
1f600 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1f610 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
1f620 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
1f630 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1f640 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1f650 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
1f660 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
1f670 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
1f680 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
1f690 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
1f6a0 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
1f6b0 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
1f6c0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
1f6d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
1f6e0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
1f6f0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
1f700 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
1f710 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1f720 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
1f730 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1f740 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
1f750 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1f760 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1f770 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
1f780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1f790 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
1f7a0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
1f7b0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f7d0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1f7e0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1f7f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1f800 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1f810 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1f820 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1f830 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1f840 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1f850 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1f860 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f870 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1f880 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f890 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1f8a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1f8b0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1f8c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f8d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1f8e0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1f8f0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1f900 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1f910 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1f920 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1f930 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1f940 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1f950 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1f960 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1f970 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1f980 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1f990 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1f9a0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1f9b0 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1f9c0 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1f9d0 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1f9e0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1f9f0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1fa00 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1fa10 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1fa20 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1fa30 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1fa40 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1fa50 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1fa60 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1fa70 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1fa80 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1fa90 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1faa0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1fab0 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1fac0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1fad0 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
1fae0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1faf0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1fb00 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1fb10 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1fb20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1fb30 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1fb40 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1fb50 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1fb60 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1fb70 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1fb80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1fb90 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1fba0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1fbb0 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
1fbc0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
1fbd0 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
1fbe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fbf0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1fc00 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
1fc10 50 61 67 65 2c 20 30 2c 20 28 70 70 50 61 67 65  Page, 0, (ppPage
1fc20 3d 3d 30 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0));.    asser
1fc30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1fc40 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
1fc50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
1fc70 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
1fc80 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1fc90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
1fca0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
1fcb0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
1fcc0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
1fcd0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1fce0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1fcf0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1fd00 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1fd10 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
1fd20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
1fd30 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
1fd40 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
1fd50 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
1fd60 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
1fd70 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
1fd80 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1fd90 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
1fda0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1fdb0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
1fdc0 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
1fdd0 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
1fde0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1fdf0 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
1fe00 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
1fe10 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
1fe20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
1fe30 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
1fe40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fe50 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
1fe60 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
1fe70 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
1fe80 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
1fe90 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1fea0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
1feb0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1fec0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
1fed0 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
1fee0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1fef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1ff00 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
1ff10 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
1ff20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1ff30 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
1ff40 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff60 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
1ff70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
1ff80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ff90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1ffa0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1ffb0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
1ffd0 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
1ffe0 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
1fff0 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
20000 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
20010 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
20020 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
20030 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
20040 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
20050 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
20060 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
20070 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
20080 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
20090 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
200a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
200b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
200c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
200d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
200e0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
200f0 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
20100 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
20110 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
20120 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
20130 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
20140 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
20150 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
20160 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20180 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20190 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
201a0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
201b0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
201c0 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
201d0 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
201e0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
201f0 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
20200 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
20210 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
20220 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
20230 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
20240 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
20250 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
20260 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
20270 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
20280 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
20290 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
202a0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
202b0 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
202c0 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
202d0 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
202e0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
202f0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
20300 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
20310 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
20320 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
20330 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
20340 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
20350 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
20360 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
20370 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
20380 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
20390 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
203a0 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
203b0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
203c0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
203d0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
203e0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
203f0 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
20400 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
20410 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
20420 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
20430 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
20440 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
20450 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
20460 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
20470 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
20480 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
20490 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
204a0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
204b0 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
204c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
204d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
204e0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
204f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
20500 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
20510 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
20520 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
20530 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
20540 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
20550 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
20560 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
20570 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
20580 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
20590 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
205a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
205b0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
205c0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
205d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
205e0 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
205f0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
20600 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
20610 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
20620 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
20630 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
20640 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
20650 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
20660 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
20670 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
20680 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
20690 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
206a0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
206b0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
206c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
206d0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
206e0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
206f0 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
20700 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
20710 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
20720 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
20730 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
20740 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
20750 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
20760 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
20770 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
20780 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
20790 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
207a0 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
207b0 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
207c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
207d0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
207e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
207f0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
20800 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d   iIdx = 0;.  Mem
20810 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
20820 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20830 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65  >iPage]; /* Btre
20840 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
20850 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53  t entry */.  BtS
20860 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
20870 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  r->pBt;         
20880 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
20890 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
208a0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
208b0 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
208c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
208d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
208e0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
208f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
20900 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
20910 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
20920 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20930 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
20940 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
20950 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
20960 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
20970 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
20980 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
20990 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
209a0 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72   ? 0 : (int)pCur
209b0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20  ->info.nKey);.. 
209c0 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65   if( NEVER(offse
209d0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
209e0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a  r->info.nData) .
209f0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
20a00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20a10 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
20a20 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
20a30 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
20a40 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
20a50 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
20a60 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
20a70 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
20a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20a90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20aa0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
20ab0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
20ac0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
20ad0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
20ae0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
20af0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
20b00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
20b10 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
20b20 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
20b30 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
20b40 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
20b50 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
20b60 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
20b70 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
20b80 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
20b90 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
20ba0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
20bb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
20bc0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
20bd0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
20be0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
20bf0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
20c00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20c10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
20c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
20c30 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
20c40 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
20c50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20c60 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
20c70 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
20c80 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
20c90 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
20ca0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
20cb0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
20cc0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
20cd0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
20ce0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
20cf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
20d00 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
20d10 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
20d20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
20d30 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
20d40 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
20d50 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
20d60 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
20d70 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
20d80 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
20d90 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
20da0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
20db0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
20dc0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
20dd0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
20de0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
20df0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
20e00 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
20e10 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
20e20 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
20e30 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
20e40 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
20e50 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
20e60 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
20e70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
20e80 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
20e90 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
20ea0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
20eb0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
20ec0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
20ed0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
20ee0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20ef0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
20f00 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
20f10 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
20f20 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
20f30 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
20f40 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
20f50 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20      /* nOvfl is 
20f60 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
20f70 20 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72    If it were zer
20f80 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20  o, fetchPayload 
20f90 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20  would have.     
20fa0 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e   ** been used in
20fb0 73 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f  stead of this ro
20fc0 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20  utine. */.      
20fd0 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c  if( ALWAYS(nOvfl
20fe0 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  ) && !pCur->aOve
20ff0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
21000 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21010 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
21020 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
21030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21040 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
21050 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
21060 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72   the.    ** entr
21070 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  y for the first 
21080 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f  required overflo
21090 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c  w page is valid,
210a0 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72   skip.    ** dir
210b0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
210c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
210d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
210e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
210f0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
21100 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
21110 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
21120 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
21130 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
21140 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
21150 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
21160 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
21170 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66   }.#endif..    f
21180 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
21190 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
211a0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
211b0 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ){..#ifndef SQLI
211c0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
211d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
211e0 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
211f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
21200 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
21210 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
21220 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
21230 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
21240 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
21250 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
21260 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
21270 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
21280 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21290 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
212a0 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  e;.      }.#endi
212b0 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  f..      if( off
212c0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
212d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
212e0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
212f0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
21300 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
21310 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
21320 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
21330 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
21340 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
21350 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
21360 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
21370 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
21380 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
21390 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
213a0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
213b0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
213c0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
213d0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
213e0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
213f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
21400 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
21410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
21420 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
21430 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
21440 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
21450 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
21460 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
21470 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
21480 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
21490 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
214a0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
214b0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
214c0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
214d0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
214e0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
214f0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
21500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21510 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
21520 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
21530 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
21540 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
21550 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
21560 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
21570 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
21580 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
21590 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
215a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
215b0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
215c0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
215d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
215e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
215f0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
21600 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
21610 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
21620 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
21630 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
21640 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
21650 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
21660 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
21670 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
21680 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
21690 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
216a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
216b0 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
216c0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
216d0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
216e0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
216f0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
21700 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
21710 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
21720 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
21730 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21740 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
21750 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
21760 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
21770 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
21780 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
21790 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74   **   5) the dat
217a0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57  abase is not a W
217b0 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20  AL database,.   
217c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
217d0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
217e0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
217f0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
21800 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
21810 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
21820 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
21830 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
21840 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
21850 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
21860 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
21870 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
21880 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
21890 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
218a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
218b0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
218f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
21900 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
21940 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
21950 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
21960 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
21970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
21980 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  4) */.         &
21990 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
219a0 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
219b0 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
219c0 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
219d0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
219e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39  pPage1->aData[19
219f0 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20  ]==0x01         
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a10 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
21a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
21a30 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
21a40 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
21a50 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
21a60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
21a70 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
21a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21a90 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
21aa0 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
21ab0 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
21ac0 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
21ad0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
21ae0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
21af0 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
21b00 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
21b10 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
21b20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
21b30 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
21b40 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
21b50 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
21b60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21b70 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
21b80 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
21b90 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
21ba0 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20          (eOp==0 
21bb0 3f 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f  ? PAGER_ACQUIRE_
21bc0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
21bd0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
21be0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21bf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21c00 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
21c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
21c20 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
21c30 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
21c40 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
21c50 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
21c60 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
21c70 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
21c80 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
21c90 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
21ca0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
21cb0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21cc0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
21cd0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
21ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
21cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21d00 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
21d10 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
21d20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21d30 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
21d40 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
21d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21d60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21d80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
21d90 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
21da0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21db0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
21dc0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
21dd0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
21de0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
21df0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
21e00 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
21e10 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
21e20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
21e30 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
21e40 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
21e50 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
21e60 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
21e70 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21e80 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21e90 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
21ea0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
21eb0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
21ec0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
21ed0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
21ee0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
21ef0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
21f00 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
21f10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
21f20 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
21f30 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
21f40 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
21f50 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
21f60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21f70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21f80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21f90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21fa0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21fb0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
21fc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21fd0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
21fe0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21ff0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
22000 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22010 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
22020 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
22030 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
22040 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
22050 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
22060 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
22070 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
22080 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
22090 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
220a0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
220b0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
220c0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
220d0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
220e0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
220f0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
22100 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
22110 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
22120 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
22130 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
22140 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
22150 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
22160 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
22170 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
22180 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
22190 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
221a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
221b0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
221c0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
221d0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
221e0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
221f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22200 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
22210 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
22220 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
22230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22240 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
22250 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
22260 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22270 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
22280 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
22290 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
222a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
222b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
222c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
222d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
222e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
222f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
22300 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22310 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
22320 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
22330 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22340 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
22350 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
22360 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
22370 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
22380 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
22390 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
223a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
223b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
223c0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
223d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
223e0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
223f0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
22400 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
22410 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
22420 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
22430 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
22440 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
22450 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
22460 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
22470 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
22480 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
22490 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
224a0 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
224b0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
224c0 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
224d0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
224e0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
224f0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
22500 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
22510 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
22520 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
22530 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
22540 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
22550 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
22560 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
22570 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
22580 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
22590 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
225a0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
225b0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
225c0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
225d0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
225e0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
225f0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
22600 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
22610 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
22620 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
22630 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
22640 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
22650 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
22660 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
22670 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
22680 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
22690 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
226a0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
226b0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
226c0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
226d0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
226e0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
226f0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
22700 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
22710 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
22720 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
22730 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
22740 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
22750 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
22760 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
22770 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
22780 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
22790 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
227a0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
227b0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
227c0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
227d0 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
227e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
227f0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22800 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
22810 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
22820 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
22830 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
22840 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
22850 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
22860 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
22870 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22880 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
22890 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
228a0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
228b0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
228c0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
228d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
228e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
228f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22900 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
22910 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22920 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22930 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22940 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22950 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
22960 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22970 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
22980 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ll );.  if( NEVE
22990 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  R(pCur->info.nSi
229a0 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74  ze==0) ){.    bt
229b0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
229c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
229d0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
229e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
229f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22a00 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f       &pCur->info
22a10 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61  );.  }.  aPayloa
22a20 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
22a30 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
22a40 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
22a50 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
22a60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
22a70 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
22a80 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
22a90 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
22aa0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
22ab0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
22ac0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
22ad0 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
22ae0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22af0 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
22b00 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
22b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  ;.    assert( nL
22b30 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20  ocal<=nKey );.  
22b40 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
22b50 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
22b60 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
22b70 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
22b80 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
22b90 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
22ba0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
22bb0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
22bc0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
22bd0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
22be0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
22bf0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
22c00 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
22c10 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
22c20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
22c30 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22c40 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
22c50 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
22c60 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
22c70 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
22c80 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
22c90 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
22ca0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
22cb0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
22cc0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
22cd0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
22ce0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
22cf0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
22d00 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
22d10 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
22d20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
22d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
22d40 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
22d50 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
22d60 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
22d70 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
22d80 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
22d90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
22da0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
22db0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
22dc0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
22dd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22de0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
22df0 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
22e00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22e10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22e20 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
22e30 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
22e40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22e50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
22e60 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
22e70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22e80 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
22e90 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
22ea0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
22eb0 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
22ec0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e   return p;.}.con
22ed0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
22ee0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
22ef0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22f00 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
22f10 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
22f20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22f30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22f40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
22f50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
22f60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22f70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
22f80 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
22f90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22fa0 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
22fb0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
22fc0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
22fd0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
22fe0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
22ff0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
23000 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
23010 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
23020 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
23030 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
23040 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
23050 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
23060 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
23070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
23080 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
23090 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
230a0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
230b0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
230c0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
230d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
230e0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
230f0 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
23100 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
23110 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
23120 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
23130 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
23140 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
23150 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
23160 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
23170 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23180 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
23190 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
231a0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
231b0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
231c0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
231d0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
231e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
231f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23200 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23210 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23220 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23230 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23240 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
23250 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
23260 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23270 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
23280 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
23290 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
232a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
232b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
232c0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
232d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
232e0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
232f0 50 61 67 65 2c 20 28 70 43 75 72 2d 3e 77 72 46  Page, (pCur->wrF
23300 6c 61 67 3d 3d 30 29 29 3b 0a 20 20 69 66 28 20  lag==0));.  if( 
23310 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
23320 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
23330 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
23340 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
23350 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
23360 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
23370 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23380 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23390 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
233a0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
233b0 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e   || pNewPage->in
233c0 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61  tKey!=pCur->apPa
233d0 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[i]->intKey ){
233e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
233f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
23420 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  0./*.** Page pPa
23430 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
23440 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
23450 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
23460 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
23470 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
23480 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
23490 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
234a0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
234b0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
234c0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
234d0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
234e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
234f0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
23500 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
23510 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
23520 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
23530 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
23540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23550 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
23560 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
23570 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
23580 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
23590 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
235a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
235b0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
235c0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
235d0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
235e0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
235f0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
23600 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
23610 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
23620 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
23630 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
23640 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
23650 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
23660 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
23670 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
23680 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
23690 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
236a0 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
236b0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
236c0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
236d0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
236e0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
236f0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
23700 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
23710 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
23720 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
23730 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
23740 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
23750 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
23760 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
23770 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
23780 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
23790 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
237a0 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
237b0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
237c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
237d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
237e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
237f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23800 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23820 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
23830 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23840 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
23850 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20  ;..  /* UPDATE: 
23860 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70  It is actually p
23870 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
23880 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64  condition tested
23890 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a 20   by the assert. 
238a0 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20   ** below to be 
238b0 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64 61  untrue if the da
238c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
238d0 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e  orrupt. This can
238e0 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f   occur if.  ** o
238f0 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  ne cursor has mo
23900 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61 72  dified page pPar
23910 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66 65  ent while a refe
23920 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68  rence to it is h
23930 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73  eld .  ** by a s
23940 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68  econd cursor. Wh
23950 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
23960 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20  pen if a single 
23970 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20  page is linked. 
23980 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68   ** into more th
23990 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
239a0 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72  ructure in a cor
239b0 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20  rupt database.  
239c0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
239d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
239e0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
239f0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
23a00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23a10 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
23a20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
23a30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23a40 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66  pgno.  );.#endif
23a50 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75  .  testcase( pCu
23a60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23a70 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e  Page-1] > pCur->
23a80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23a90 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  ge-1]->nCell );.
23aa0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
23ab0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23ac0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75  ->iPage]);.  pCu
23ad0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43  r->iPage--;.  pC
23ae0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23af0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
23b00 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dNKey = 0;.}../*
23b10 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23b20 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
23b30 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
23b40 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
23b50 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
23b60 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
23b70 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23b80 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
23b90 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
23ba0 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
23bb0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23bc0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
23bd0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
23be0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
23bf0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
23c00 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
23c10 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
23c20 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
23c30 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
23c40 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
23c50 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
23c60 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
23c70 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
23c80 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
23c90 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23ca0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
23cb0 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
23cc0 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
23cd0 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
23ce0 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
23cf0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
23d00 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
23d10 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
23d20 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
23d30 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
23d40 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
23d50 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
23d60 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
23d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
23d80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
23d90 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
23da0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
23db0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
23dc0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
23dd0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
23de0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
23df0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
23e00 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
23e10 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
23e20 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
23e30 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
23e40 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
23e50 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
23e60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
23e70 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
23e80 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
23e90 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
23ea0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
23eb0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
23ec0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
23ed0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
23ee0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
23ef0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
23f00 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
23f10 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
23f20 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
23f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
23f40 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
23f50 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
23f60 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
23f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23f80 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
23f90 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
23fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23fb0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
23fc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23fd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23fe0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
23ff0 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
24000 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
24010 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
24020 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
24030 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
24040 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
24050 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
24060 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24070 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
24080 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
24090 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
240a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
240b0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
240c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
240d0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
240e0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
240f0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
24100 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
24110 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
24120 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
24130 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
24140 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
24150 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
24160 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
24170 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
24180 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24190 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
241a0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
241b0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
241c0 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
241d0 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
241e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
241f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
24200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24210 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
24220 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
24230 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
24240 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
24250 3e 61 70 50 61 67 65 5b 30 5d 2c 20 70 43 75 72  >apPage[0], pCur
24260 2d 3e 77 72 46 6c 61 67 3d 3d 30 29 3b 0a 20 20  ->wrFlag==0);.  
24270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
24290 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
242a0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
242b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
242c0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
242d0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
242e0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
242f0 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
24300 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
24310 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
24320 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
24330 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
24340 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
24350 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
24360 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
24370 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
24380 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
24390 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
243a0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
243b0 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
243c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
243d0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
243e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
243f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
24400 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
24410 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
24420 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
24430 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
24440 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
24450 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
24460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24470 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24480 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
24490 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
244a0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
244b0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
244c0 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
244d0 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
244e0 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
244f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
24500 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
24510 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
24520 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
24530 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
24540 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
24550 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
24560 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
24570 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
24580 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
24590 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
245a0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
245b0 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
245c0 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
245d0 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
245e0 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
245f0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
24600 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
24610 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
24620 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
24630 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
24640 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
24650 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
24660 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
24670 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
24680 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
24690 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
246a0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
246b0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
246c0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
246d0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
246e0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
246f0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
24700 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
24710 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
24720 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
24730 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
24740 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
24750 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24760 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
24770 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
24780 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
24790 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
247a0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
247b0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
247c0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
247d0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
247e0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
247f0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24800 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
24810 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
24820 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
24830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
24850 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
24860 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
24870 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24880 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
24890 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
248a0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
248b0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
248c0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
248d0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
248e0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
248f0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
24900 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
24910 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24920 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
24930 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24940 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
24950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24960 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
24970 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
24980 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24990 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
249a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
249b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
249c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
249d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
249e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
249f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24a00 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
24a10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24a20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24a30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24a40 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24a50 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24a60 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
24a70 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
24a80 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24a90 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24aa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24ab0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
24ac0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
24ad0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
24ae0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24af0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
24b00 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
24b10 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24b20 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
24b30 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
24b40 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
24b50 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
24b60 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
24b70 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
24b80 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
24b90 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
24ba0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
24bb0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
24bc0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
24bd0 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
24be0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
24bf0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
24c00 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
24c10 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
24c20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
24c30 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
24c40 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
24c50 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
24c60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
24c70 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
24c80 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24c90 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24cb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24cc0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
24cd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24ce0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24cf0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24d00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24d10 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
24d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
24d30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24d40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24d50 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
24d60 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
24d70 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
24d80 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
24d90 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
24da0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24db0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
24dc0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24dd0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
24de0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
24df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24e00 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
24e10 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
24e20 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
24e30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24e40 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
24e50 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
24e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24e70 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
24e80 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
24e90 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
24ea0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
24eb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
24ec0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
24ed0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
24ee0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
24ef0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
24f00 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
24f10 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
24f20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
24f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24f40 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
24f50 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
24f60 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
24f70 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24f80 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24f90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24fa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24fb0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24fc0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
24fd0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
24fe0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
24ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25000 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
25010 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
25020 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
25030 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
25040 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
25050 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25060 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
25070 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
25080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25090 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
250a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
250b0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
250c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
250d0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
250e0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
250f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
25100 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
25110 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
25120 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
25130 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
25140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
25150 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
25160 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
25170 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
25180 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
25190 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
251a0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
251b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
251c0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
251d0 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
251e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
251f0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
25200 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
25210 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25220 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25230 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25240 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
25250 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
25260 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
25270 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
25280 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
25290 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
252a0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
252b0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
252c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
252d0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b   pCur->atLast ){
252e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
252f0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
25300 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
25310 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
25320 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
25330 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
25340 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
25350 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
25360 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
25370 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
25380 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
25390 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
253a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
253b0 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
253c0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
253d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
253e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
253f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
25400 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25410 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
25420 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
25430 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25440 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
25450 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
25460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25470 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
25480 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
25490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
254a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
254b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
254c0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
254d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
254e0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
254f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25500 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25510 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
25520 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
25530 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
25540 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25550 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
25560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25570 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
25580 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
25590 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
255a0 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
255b0 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
255c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
255d0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
255e0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
255f0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
25600 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
25610 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
25620 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
25630 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
25640 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
25650 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
25660 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
25670 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
25680 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
25690 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
256a0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
256b0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
256c0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
256d0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
256e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
256f0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
25700 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
25710 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
25720 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
25730 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
25740 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
25750 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
25760 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
25770 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
25780 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
25790 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
257a0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
257b0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
257c0 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
257d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
257e0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
257f0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
25800 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
25810 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
25820 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
25830 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
25840 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
25850 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
25860 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
25870 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
25880 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
25890 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
258a0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
258b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
258c0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
258e0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
258f0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
25900 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
25910 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
25920 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
25930 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
25940 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
25950 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
25960 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
25970 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
25980 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25990 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
259a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
259b0 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
259c0 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
259d0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
259e0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
259f0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
25a00 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
25a10 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
25a20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
25a30 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
25a40 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
25a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25a60 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
25a70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
25a80 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
25a90 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
25aa0 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
25ab0 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
25ac0 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
25ad0 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
25ae0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
25af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
25b00 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
25b10 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
25b20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
25b30 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
25b40 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
25b50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
25b60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
25b70 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
25b80 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
25b90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
25ba0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25bb0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25bd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
25be0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25bf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25c00 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
25c10 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
25c20 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
25c30 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
25c40 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
25c50 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
25c60 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
25c70 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
25c80 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
25c90 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
25ca0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
25cb0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
25cc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
25cd0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
25ce0 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
25cf0 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  y .   && pCur->a
25d00 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
25d10 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
25d20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
25d30 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25d40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
25d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25d60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
25d70 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
25d80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
25d90 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
25da0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
25db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25dc0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
25dd0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
25de0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
25df0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
25e00 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
25e10 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
25e20 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
25e30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25e50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
25e60 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
25e70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
25e80 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
25e90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25ea0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
25eb0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
25ec0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25ed0 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
25ee0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25ef0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
25f00 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
25f10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25f20 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
25f30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25f40 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
25f50 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
25f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25f70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25f80 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
25f90 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
25fa0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
25fb0 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
25fc0 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
25fd0 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
25fe0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25ff0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26000 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20  ];.    int c;.. 
26010 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
26020 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
26030 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
26040 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
26050 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
26060 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
26070 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
26080 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
26090 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
260a0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
260b0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
260c0 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
260d0 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
260e0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
260f0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
26100 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
26110 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
26120 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
26130 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
26140 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
26150 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
26160 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
26170 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
26180 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
26190 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
261a0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
261b0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
261c0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
261d0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
261e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
261f0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
26200 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
26210 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
26220 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
26230 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69  ll-1;.    if( bi
26240 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  asRight ){.     
26250 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26260 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
26270 29 28 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20  )(idx = upr);.  
26280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
26290 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
262a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
262b0 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f  idx = (upr+lwr)/
262c0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
262d0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20  r(;;){.      u8 
262e0 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
26310 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
26320 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  Page */..      a
26330 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72  ssert( idx==pCur
26340 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26350 61 67 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43  age] );.      pC
26360 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
26370 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
26380 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
26390 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
263a0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
263b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
263c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
263d0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
263e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
263f0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
26400 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
26410 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
26420 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
26430 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
26440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26450 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
26460 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
26470 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
26480 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
26490 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
264a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
264b0 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
264c0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
264d0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
264e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
264f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
26500 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
26510 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
26520 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
26530 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
26540 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
26550 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
26560 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
26570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26580 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
26590 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
265a0 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
265b0 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
265c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
265d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
265e0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
265f0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
26600 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
26610 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
26620 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
26630 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
26640 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
26650 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
26660 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
26670 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
26680 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
26690 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
266a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
266b0 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
266c0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
266d0 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
266e0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
266f0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
26700 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
26710 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
26720 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
26730 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
26740 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
26750 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
26760 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
26770 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
26780 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
26790 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
267a0 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f  yload.         /
267b0 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c  * && (pCell+nCel
267c0 6c 29 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l)<pPage->aDataE
267d0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  nd */.        ){
267e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
267f0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
26800 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
26810 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
26820 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
26830 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
26840 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
26850 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
26860 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
26870 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
26880 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
26890 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
268a0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
268b0 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
268c0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
268d0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
268e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
268f0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
26900 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
26910 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
26920 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
26930 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
26940 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
26950 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
26960 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
26970 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
26980 20 20 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c       /* && (pCel
26990 6c 2b 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67  l+nCell+2)<=pPag
269a0 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20  e->aDataEnd */. 
269b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
269c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
269d0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
269e0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
269f0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
26a00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
26a10 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
26a20 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
26a30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
26a40 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
26a50 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
26a60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
26a70 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
26a80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
26a90 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
26aa0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
26ab0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
26ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26ad0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
26ae0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
26af0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
26b00 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
26b10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
26b20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
26b30 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
26b40 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
26b50 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
26b60 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
26b70 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
26b80 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
26b90 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
26ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
26bb0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
26bc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
26bd0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
26be0 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
26bf0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
26c00 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
26c10 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
26c20 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
26c30 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
26c40 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
26c50 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
26c60 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
26c70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
26c80 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
26c90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
26ca0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
26cb0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
26cc0 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
26cd0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
26ce0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
26cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26d00 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
26d10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
26d20 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
26d30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
26d40 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
26d50 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
26d60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
26d70 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
26d80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26d90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
26da0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
26db0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
26dc0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26dd0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
26de0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
26df0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
26e00 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
26e10 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
26e20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
26e30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
26e40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
26e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26e60 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
26e70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
26e80 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
26e90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
26ea0 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
26eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26ec0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26ed0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
26ee0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26f00 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26f10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26f20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
26f30 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
26f40 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
26f50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26f60 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
26f70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
26f80 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
26f90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
26fb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26fc0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
26fd0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29  x = (lwr+upr)/2)
26fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
26ff0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
27000 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
27010 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27020 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27030 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
27040 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
27050 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
27060 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
27070 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
27080 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
27090 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
270a0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
270b0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
270c0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
270d0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
270e0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
270f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
27100 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
27110 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
27120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27130 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27140 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
27150 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27160 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
27170 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
27180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27190 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
271a0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
271b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
271c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
271d0 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43  (u16)lwr;.    pC
271e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
271f0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
27200 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
27210 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
27220 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
27230 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
27240 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
27250 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
27260 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ish:.  return rc
27270 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
27280 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
27290 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
272a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
272b0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
272c0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
272d0 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
272e0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
272f0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
27300 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
27310 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
27320 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
27330 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
27340 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
27350 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
27360 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
27370 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
27380 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
27390 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
273a0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
273b0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
273c0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
273d0 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
273e0 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
273f0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
27400 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
27410 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
27420 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
27430 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
27440 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
27450 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
27460 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
27470 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
27480 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
27490 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
274a0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
274b0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
274c0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
274d0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
274e0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
274f0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
27500 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
27510 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
27520 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
27530 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
27540 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27550 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
27560 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
27570 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
27580 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
27590 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
275a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
275b0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
275c0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
275d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
275e0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
275f0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27600 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
27610 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
27620 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
27630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27640 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27650 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
27660 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55  s!=0 );.  if( CU
27670 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
27680 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
27690 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
276a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
276b0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
276c0 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
276d0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
276e0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  ext = 0;.    *pR
276f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
27700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27710 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  }.  pCur->skipNe
27720 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  xt = 0;..  pPage
27730 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27740 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27750 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
27760 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27780 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
27790 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
277a0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
277b0 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
277c0 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
277d0 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
277e0 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
277f0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
27800 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
27810 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
27820 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
27830 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
27840 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
27850 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
27860 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
27870 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
27880 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
27890 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
278a0 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
278b0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
278c0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
278d0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
278e0 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
278f0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
27900 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
27910 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27920 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
27930 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
27940 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
27950 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
27960 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
27970 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
27980 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
27990 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
279a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
279b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
279c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
279d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
279e0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
279f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27a00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27a10 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
27a20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
27a30 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
27a40 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
27a50 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
27a60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
27a70 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
27a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27a90 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
27aa0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
27ab0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
27ac0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27ad0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
27ae0 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
27af0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
27b00 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
27b10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27b20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
27b30 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
27b40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
27b50 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
27b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27b80 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
27b90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
27ba0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
27bb0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27bd0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
27be0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
27bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27c00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
27c10 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
27c20 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
27c30 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
27c40 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
27c50 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
27c60 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
27c70 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
27c80 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
27c90 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
27ca0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
27cb0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
27cc0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
27cd0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
27ce0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
27cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27d00 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
27d10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
27d20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
27d30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27d40 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27d50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27d60 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
27d70 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
27d80 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
27d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27da0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
27db0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
27dc0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
27dd0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
27de0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
27df0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
27e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27e10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
27e20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
27e30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
27e40 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
27e50 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
27e60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27e70 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
27e80 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
27e90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27ea0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27ec0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
27ed0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
27ee0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
27ef0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27f00 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
27f10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
27f20 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
27f30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
27f40 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
27f50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27f60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
27f70 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
27f80 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
27f90 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
27fa0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27fb0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
27fc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
27fd0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
27fe0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
27ff0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
28000 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28010 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
28020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28030 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
28040 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
28050 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
28060 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28070 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
28080 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
28090 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
280a0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
280b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
280c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
280d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
280e0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
280f0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28100 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
28110 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
28120 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
28130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
28140 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
28150 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
28160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28170 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
28180 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
28190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
281a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
281b0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
281c0 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
281d0 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
281e0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
281f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
28200 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
28210 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
28220 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
28230 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
28240 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
28250 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
28260 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
28270 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
28280 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
28290 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
282a0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
282b0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
282c0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
282d0 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
282e0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
282f0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
28300 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
28310 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
28320 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
28330 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
28340 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
28350 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
28360 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
28370 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
28380 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
28390 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
283a0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
283b0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
283c0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
283d0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
283e0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
283f0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
28400 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
28410 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
28420 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
28430 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
28440 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
28450 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
28460 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
28470 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
28480 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
28490 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
284a0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
284b0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
284c0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
284d0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
284e0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
284f0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
28500 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
28510 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
28520 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
28530 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
28540 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
28550 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
28560 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
28570 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
28580 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
28590 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
285a0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
285b0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
285c0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
285d0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
285e0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
285f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
28600 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
28610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28620 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
28630 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
28640 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
28650 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
28660 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
28670 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
28680 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
28690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
286a0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
286b0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
286c0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
286d0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
286e0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
286f0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
28700 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
28710 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
28720 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
28730 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
28740 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
28750 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
28760 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
28770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
28780 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
28790 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
287a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
287b0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
287c0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
287d0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
287e0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
287f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
28800 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
28810 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
28820 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
28830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28840 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
28850 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28860 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
28870 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
28880 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
28890 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
288a0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
288b0 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
288c0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
288d0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
288e0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
288f0 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34  pBt);.  n = get4
28900 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28910 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
28920 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
28930 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
28940 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
28950 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28960 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
28970 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
28980 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
28990 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
289a0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
289b0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
289c0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
289d0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
289e0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
289f0 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
28a00 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
28a10 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
28a20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
28a30 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
28a40 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
28a50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
28a60 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
28a70 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
28a80 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
28a90 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
28aa0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
28ab0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
28ac0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
28ad0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
28ae0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
28af0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
28b00 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
28b10 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
28b20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
28b30 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
28b40 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
28b50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28b60 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
28b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
28b80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
28b90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
28ba0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
28bb0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
28bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28bd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28be0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
28bf0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
28c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
28c10 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
28c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28c30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
28c40 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
28c50 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
28c60 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
28c70 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
28c80 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
28c90 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
28ca0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
28cb0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
28cc0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
28cd0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28ce0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
28cf0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
28d00 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
28d10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28d20 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
28d30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
28d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
28d50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28d60 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
28d70 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
28d80 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
28d90 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
28da0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
28db0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
28dc0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
28dd0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
28de0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
28df0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
28e00 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
28e10 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
28e20 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
28e30 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
28e40 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
28e50 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
28e60 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
28e70 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
28e80 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
28e90 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
28ea0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
28eb0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
28ec0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
28ed0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
28ee0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
28ef0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
28f00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
28f10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28f20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
28f30 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
28f40 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
28f50 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
28f60 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
28f70 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
28f80 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
28f90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28fa0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28fb0 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
28fc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
28fd0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
28fe0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
28ff0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
29000 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
29010 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
29020 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
29030 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
29040 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
29050 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
29060 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
29070 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
29080 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
29090 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
290a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
290b0 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
290c0 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
290d0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
290e0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
290f0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
29100 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
29110 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
29120 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
29130 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
29140 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
29150 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
29160 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
29170 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
29180 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
29190 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
291a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
291b0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
291c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
291d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
291e0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
291f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29200 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
29210 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29220 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
29230 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
29240 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
29250 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
29260 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
29270 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
29280 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
29290 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
292a0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
292b0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
292c0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
292d0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
292e0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
292f0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
29300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
29310 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
29320 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
29330 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
29340 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
29350 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
29360 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
29370 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29380 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
293a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
293b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
293c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
293d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
293e0 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
293f0 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
29400 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
29410 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
29420 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
29430 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
29440 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
29450 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
29460 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
29470 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
29480 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
29490 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
294a0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
294b0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
294c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
294d0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
294e0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
294f0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
29500 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
29510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
29520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29530 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
29540 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
29550 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
29560 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
29570 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
29580 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29590 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
295a0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
295b0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
295c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
295d0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
295e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
295f0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
29600 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
29610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29620 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
29630 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
29640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
29670 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29680 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
29690 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
296a0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
296b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
296c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
296d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
296e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
296f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29700 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
29710 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
29720 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
29730 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
29740 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
29750 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
29760 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
29770 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
29780 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
29790 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
297a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
297b0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
297c0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
297d0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
297e0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
297f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
29800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29810 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
29820 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
29830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
29840 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29850 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
29860 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
29870 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29880 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29890 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
298a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
298b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
298c0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
298d0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 2c 20   &pNewTrunk, 0, 
298e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
298f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
29910 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29920 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
29930 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
29940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29950 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
29960 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29990 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
299a0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
299b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
299c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
299d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
299e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
299f0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
29a00 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
29a10 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
29a20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
29a30 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
29a40 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
29a50 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
29a60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
29a70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
29a80 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
29a90 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
29aa0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
29ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
29ac0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
29ad0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29af0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
29b00 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29b10 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
29b20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
29b30 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
29b40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29b50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
29b60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29b70 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
29b80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29b90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
29ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29bb0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29bc0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29be0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
29bf0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
29c00 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
29c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
29c30 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
29c40 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
29c50 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
29c60 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
29c70 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
29c80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
29c90 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
29ca0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
29cb0 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
29cc0 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
29cd0 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
29ce0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
29cf0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
29d00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
29d10 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
29d20 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
29d30 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
29d40 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
29d50 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
29d60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
29d70 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
29d80 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
29d90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
29da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
29db0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
29dc0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
29dd0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
29de0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
29df0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
29e00 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
29e10 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
29e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29e30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29e50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29e60 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
29e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
29e80 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
29e90 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
29ea0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
29eb0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
29ec0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
29ed0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
29ee0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
29ef0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
29f00 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
29f10 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
29f20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
29f30 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
29f40 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
29f50 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
29f60 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
29f70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
29f80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
29f90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29fa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29fb0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
29fc0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
29fd0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
29fe0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
29ff0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2a000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2a010 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2a020 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2a030 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2a040 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a050 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a060 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2a070 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2a080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2a0a0 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2a0b0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2a0c0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2a0d0 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2a0e0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2a0f0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2a100 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2a110 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2a120 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2a130 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2a140 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2a150 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2a160 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2a170 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2a180 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2a190 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2a1a0 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2a1b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a1c0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2a1d0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2a1e0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2a1f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2a200 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a210 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2a220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a230 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2a240 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2a250 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2a260 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2a270 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2a280 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2a290 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2a2a0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2a2b0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2a2c0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2a2d0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2a2e0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2a2f0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2a300 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
2a310 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2a320 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2a330 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
2a340 43 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20  Content, 0);.   
2a350 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2a360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a370 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a380 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2a390 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2a3a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2a3b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a3c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2a3d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2a3e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
2a3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
2a410 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2a420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2a430 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2a440 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2a450 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2a460 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
2a470 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
2a480 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2a490 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
2a4a0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2a4b0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
2a4c0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
2a4d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2a4e0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
2a4f0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
2a500 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
2a510 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
2a520 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
2a530 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2a540 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
2a550 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
2a560 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
2a570 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
2a580 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
2a590 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
2a5a0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
2a5b0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
2a5c0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
2a5d0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
2a5e0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2a5f0 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
2a600 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
2a610 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
2a620 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
2a630 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
2a640 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
2a650 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
2a660 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
2a670 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
2a680 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
2a690 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
2a6a0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
2a6b0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
2a6c0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
2a6d0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
2a6e0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
2a6f0 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
2a700 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
2a710 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
2a720 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
2a730 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2a740 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
2a750 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
2a760 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
2a770 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
2a780 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
2a790 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
2a7a0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
2a7b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
2a7c0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
2a7d0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
2a7e0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
2a7f0 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
2a800 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
2a810 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
2a820 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
2a830 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
2a840 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
2a850 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
2a860 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2a870 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
2a880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a890 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2a8a0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
2a8b0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
2a8c0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
2a8d0 29 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  ));..    rc = sq
2a8e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a8f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
2a900 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2a910 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2a920 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
2a930 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
2a940 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
2a950 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
2a960 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
2a970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a980 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2a990 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2a9a0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
2a9b0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
2a9c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
2a9d0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
2a9e0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
2a9f0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
2aa00 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
2aa10 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
2aa20 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2aa30 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
2aa40 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
2aa50 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
2aa60 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
2aa70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2aa80 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
2aa90 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
2aaa0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
2aab0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
2aac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
2aad0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2aae0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
2aaf0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
2ab00 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
2ab10 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
2ab20 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
2ab30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ab40 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
2ab50 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2ab60 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
2ab70 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
2ab80 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tent, 0);.      
2ab90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2aba0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2abb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2abc0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2abd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2abe0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2abf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ac00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ac10 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2ac20 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2ac30 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2ac40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ac50 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2ac60 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2ac70 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2ac80 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2ac90 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2aca0 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2acb0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2acc0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2acd0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2ace0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2acf0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2ad00 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2ad10 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2ad20 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 69  ntent, 0);.    i
2ad30 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ad40 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2ad50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2ad60 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2ad70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ad80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ad90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2ada0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2adb0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2adc0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2add0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
2ade0 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
2adf0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2ae00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2ae10 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
2ae20 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
2ae30 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2ae40 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2ae50 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
2ae60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ae70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
2ae80 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2ae90 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
2aea0 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
2aeb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2aec0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2aed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2aee0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2aef0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2af00 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2af10 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2af20 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2af30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2af40 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2af50 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2af60 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2af70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2af80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2af90 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2afa0 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2afb0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2afc0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2afd0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2afe0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2aff0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2b000 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2b010 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2b020 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2b030 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2b040 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2b050 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2b060 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2b070 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2b080 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2b090 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2b0a0 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2b0b0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2b0c0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2b0d0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2b0e0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2b0f0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2b100 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2b110 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2b120 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2b130 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2b140 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2b150 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2b160 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2b170 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2b180 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2b190 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2b1a0 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2b1b0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2b1c0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2b1d0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2b1e0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2b1f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b200 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2b210 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2b220 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2b250 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2b260 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2b270 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2b280 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2b290 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2b2a0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2b2b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2b2c0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2b2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2b2e0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2b2f0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2b300 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2b330 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2b340 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b360 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2b370 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2b380 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2b390 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2b3a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2b3b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2b3c0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2b3d0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2b3e0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2b3f0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2b400 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2b410 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2b420 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2b430 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2b440 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2b450 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2b460 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2b470 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2b480 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2b490 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2b4a0 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2b4b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b4c0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2b4d0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2b4e0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2b4f0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2b500 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2b510 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2b520 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2b530 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2b540 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2b550 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2b560 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2b570 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2b580 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2b590 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2b5a0 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2b5b0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2b5c0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2b5d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2b5e0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2b5f0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2b600 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2b610 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2b620 20 26 70 50 61 67 65 2c 20 30 2c 20 30 29 29 21   &pPage, 0, 0))!
2b630 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
2b640 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
2b650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b660 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2b670 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2b680 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2b690 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2b6a0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
2b6b0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
2b6c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2b6d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2b6e0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2b6f0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2b700 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
2b710 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2b720 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
2b730 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2b740 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
2b750 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2b760 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
2b770 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
2b780 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
2b790 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
2b7a0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2b7b0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
2b7c0 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
2b7d0 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
2b7e0 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
2b7f0 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
2b800 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
2b810 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
2b820 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2b830 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
2b840 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
2b850 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
2b860 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2b870 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
2b880 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
2b890 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
2b8a0 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
2b8b0 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
2b8c0 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
2b8d0 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
2b8e0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
2b8f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
2b900 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
2b910 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
2b920 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
2b930 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
2b940 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
2b950 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
2b960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
2b970 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
2b980 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
2b990 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2b9a0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2b9b0 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
2b9c0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
2b9d0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2b9e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2b9f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2ba00 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2ba10 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2ba20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2ba30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ba40 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2ba50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
2ba60 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
2ba70 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2ba80 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
2ba90 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2baa0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
2bab0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
2bac0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2bad0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
2bae0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2baf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
2bb00 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2bb10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2bb20 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
2bb30 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2bb40 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
2bb50 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2bb60 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
2bb70 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
2bb80 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
2bb90 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
2bba0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
2bbb0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2bbc0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2bbd0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
2bbe0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
2bbf0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
2bc00 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
2bc10 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
2bc20 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
2bc30 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2bc40 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
2bc50 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
2bc60 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
2bc70 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
2bc80 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
2bc90 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
2bca0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
2bcb0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
2bcc0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
2bcd0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
2bce0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2bcf0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
2bd00 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
2bd10 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
2bd20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
2bd30 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
2bd40 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
2bd50 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
2bd60 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2bd70 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
2bd80 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
2bd90 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
2bda0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
2bdb0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2bdc0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
2bdd0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
2bde0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
2bdf0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
2be00 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
2be10 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
2be20 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
2be30 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
2be40 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
2be50 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
2be60 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
2be70 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
2be80 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
2be90 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
2bea0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2beb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2bec0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2bed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2bee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bef0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2bf00 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
2bf10 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
2bf20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2bf30 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
2bf40 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
2bf50 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
2bf60 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
2bf70 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2bf80 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
2bf90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2bfa0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
2bfb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2bfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2bfd0 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
2bfe0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
2bff0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2c000 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2c010 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
2c020 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
2c030 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
2c040 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
2c050 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2c060 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
2c070 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
2c080 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
2c090 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
2c0a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2c0b0 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
2c0c0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
2c0d0 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
2c0e0 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
2c0f0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2c100 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
2c110 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2c120 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
2c130 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
2c140 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
2c150 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2c160 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2c170 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
2c180 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
2c190 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
2c1a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2c1b0 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
2c1c0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2c1d0 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
2c1e0 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
2c1f0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
2c200 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2c210 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
2c220 30 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  0, 0)) ){.    go
2c230 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2c240 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2c250 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c260 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2c270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c280 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
2c290 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2c2a0 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
2c2b0 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
2c2c0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2c2d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
2c2e0 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
2c2f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2c300 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
2c310 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
2c320 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
2c330 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
2c340 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2c350 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
2c360 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
2c370 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
2c380 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
2c390 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2c3a0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
2c3b0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
2c3c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2c3d0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
2c3e0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
2c3f0 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
2c400 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
2c410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
2c420 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
2c430 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
2c440 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
2c450 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
2c460 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
2c470 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
2c480 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
2c490 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
2c4a0 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
2c4b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
2c4c0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2c4d0 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
2c4e0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2c4f0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
2c500 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
2c510 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
2c520 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32  int nOvfl;.  u32
2c530 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
2c540 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c550 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2c560 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2c570 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
2c580 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
2c590 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
2c5a0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2c5b0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
2c5c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
2c5d0 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
2c5e0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
2c5f0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
2c600 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2c610 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
2c620 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e  flow+3 > pPage->
2c630 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
2c640 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  kPage ){.    ret
2c650 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2c660 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c  PT_BKPT;  /* Cel
2c670 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
2c680 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
2c690 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
2c6a0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
2c6b0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
2c6c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
2c6d0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
2c6e0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
2c6f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2c700 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
2c710 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
2c720 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
2c730 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
2c740 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
2c750 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
2c760 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
2c770 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
2c780 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
2c790 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
2c7a0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2c7b0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
2c7c0 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
2c7d0 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
2c7e0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
2c7f0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
2c800 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
2c810 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
2c820 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
2c830 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
2c840 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
2c850 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
2c860 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2c870 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
2c880 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2c890 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
2c8a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c8b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c8c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2c8d0 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
2c8e0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
2c8f0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
2c900 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
2c910 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
2c920 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2c930 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
2c940 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
2c950 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
2c960 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
2c970 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
2c980 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2c990 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
2c9a0 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
2c9b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2c9c0 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
2c9d0 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
2c9e0 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
2c9f0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
2ca00 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
2ca10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
2ca20 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
2ca30 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
2ca40 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
2ca50 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
2ca60 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
2ca70 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
2ca80 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
2ca90 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
2caa0 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
2cab0 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
2cac0 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
2cad0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2cae0 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
2caf0 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
2cb00 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
2cb10 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
2cb20 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
2cb30 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
2cb40 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
2cb50 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
2cb60 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
2cb70 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
2cb80 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
2cb90 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
2cba0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
2cbb0 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
2cbc0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
2cbd0 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
2cbe0 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
2cbf0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
2cc00 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
2cc10 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
2cc20 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
2cc30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cc40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2cc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cc60 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
2cc70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
2cc80 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
2cc90 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
2cca0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2ccb0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
2ccc0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2ccd0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2cce0 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
2ccf0 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
2cd00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cd10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
2cd20 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
2cd30 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
2cd40 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
2cd50 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
2cd60 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
2cd70 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
2cd80 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
2cd90 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
2cda0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
2cdb0 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
2cdc0 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
2cdd0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
2cde0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2cdf0 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2ce00 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
2ce10 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2ce20 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
2ce30 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
2ce40 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
2ce50 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
2ce60 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
2ce70 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
2ce80 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
2ce90 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
2cea0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
2ceb0 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
2cec0 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
2ced0 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
2cee0 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
2cef0 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
2cf00 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
2cf10 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
2cf20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
2cf30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2cf40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cf50 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
2cf60 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
2cf70 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
2cf80 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
2cf90 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
2cfa0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
2cfb0 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
2cfc0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2cfd0 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2cfe0 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
2cff0 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
2d000 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
2d010 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
2d020 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2d030 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2d040 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
2d050 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
2d060 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
2d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d080 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
2d090 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
2d0a0 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
2d0b0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
2d0c0 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
2d0d0 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
2d0e0 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
2d0f0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
2d100 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
2d110 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
2d120 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
2d130 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d140 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
2d150 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2d160 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
2d170 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
2d180 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
2d190 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
2d1a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d1b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2d1c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2d1d0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
2d1e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2d1f0 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
2d200 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
2d210 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
2d220 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
2d230 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
2d240 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
2d250 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
2d260 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
2d270 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
2d280 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
2d290 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2d2b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2d2c0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2d2d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2d2e0 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
2d2f0 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
2d300 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
2d310 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d320 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
2d330 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
2d340 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
2d350 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
2d360 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
2d370 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
2d380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2d390 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
2d3a0 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
2d3b0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2d3c0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
2d3d0 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62  u64*)&nKey);.  b
2d3e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2d3f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2d400 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
2d410 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
2d420 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
2d430 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
2d440 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2d450 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
2d460 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
2d470 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
2d480 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
2d490 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
2d4a0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
2d4b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d4c0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
2d4d0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
2d4e0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
2d4f0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
2d500 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28   .    if( NEVER(
2d510 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
2d520 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20  || pKey==0) ){. 
2d530 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d540 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2d550 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2d560 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79  oad += (int)nKey
2d570 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
2d580 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
2d590 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a  nt)nKey;.  }.  *
2d5a0 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
2d5b0 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
2d5c0 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
2d5d0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
2d5e0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
2d5f0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
2d600 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
2d610 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
2d620 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
2d630 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
2d640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d650 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d660 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
2d670 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
2d680 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
2d690 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
2d6a0 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
2d6b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2d6c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2d6d0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
2d6e0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
2d6f0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
2d700 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
2d710 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
2d720 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
2d730 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2d740 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
2d750 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
2d760 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
2d770 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2d780 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
2d790 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
2d7a0 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
2d7b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2d7c0 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
2d7d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2d7e0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2d7f0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
2d800 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
2d810 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
2d820 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
2d830 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
2d840 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
2d850 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2d860 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
2d870 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
2d880 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
2d890 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2d8a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2d8b0 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
2d8c0 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
2d8d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
2d8e0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
2d8f0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
2d900 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
2d910 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
2d920 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
2d930 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
2d940 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
2d950 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
2d960 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
2d970 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
2d980 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20  tialized values 
2d990 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
2d9a0 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
2d9b0 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
2d9c0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
2d9d0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2d9e0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
2d9f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2da00 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
2da10 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
2da20 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
2da30 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
2da40 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2da50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
2da60 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
2da70 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
2da80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2da90 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2daa0 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
2dab0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2dac0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
2dad0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2dae0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
2daf0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
2db00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2db10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
2db20 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2db30 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
2db40 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2db50 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
2db60 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2db70 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2db80 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2db90 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2dba0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
2dbb0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2dbc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2dbd0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2dbe0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2dbf0 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
2dc00 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
2dc10 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2dc20 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2dc30 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
2dc40 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2dc50 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
2dc60 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
2dc70 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2dc80 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
2dc90 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2dca0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2dcb0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2dcc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2dcd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2dce0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2dcf0 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
2dd00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2dd10 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2dd20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
2dd30 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
2dd40 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
2dd50 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
2dd60 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
2dd70 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
2dd80 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
2dd90 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
2dda0 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
2ddb0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
2ddc0 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
2ddd0 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
2dde0 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
2ddf0 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
2de00 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
2de10 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
2de20 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
2de30 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2de40 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
2de50 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
2de60 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
2de70 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2de80 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2de90 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2dea0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2deb0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2dec0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2ded0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
2dee0 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
2def0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2df00 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2df10 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2df20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2df30 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
2df40 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
2df50 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2df60 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
2df70 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2df80 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2df90 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2dfa0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2dfb0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2dfc0 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
2dfd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
2dfe0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
2dff0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e000 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
2e010 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
2e020 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
2e030 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
2e040 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
2e050 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2e060 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
2e070 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
2e080 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
2e090 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
2e0a0 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
2e0b0 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
2e0c0 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
2e0d0 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
2e0e0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
2e0f0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2e100 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2e110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e120 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
2e130 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
2e140 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
2e150 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
2e160 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
2e170 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
2e180 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
2e190 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
2e1a0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2e1b0 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
2e1c0 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
2e1d0 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
2e1e0 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
2e1f0 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
2e200 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
2e210 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
2e220 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
2e230 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
2e240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2e250 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
2e260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
2e270 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
2e280 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
2e290 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
2e2a0 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
2e2b0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2e2c0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
2e2d0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
2e2e0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
2e2f0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
2e300 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
2e310 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2e320 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
2e330 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
2e340 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
2e350 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20  u8 *endPtr;     
2e360 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a  /* End of loop *
2e370 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2e380 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2e390 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2e3a0 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
2e3b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2e3c0 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
2e3d0 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
2e3e0 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
2e3f0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2e400 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2e410 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2e420 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
2e430 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
2e440 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
2e450 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e460 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e470 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2e480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2e4a0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2e4b0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
2e4c0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
2e4d0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
2e4e0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
2e4f0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
2e500 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2e510 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
2e520 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
2e530 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2e540 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
2e550 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
2e560 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2e570 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
2e580 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
2e590 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
2e5a0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
2e5b0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2e5c0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
2e5d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e5e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2e5f0 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
2e600 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
2e610 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
2e620 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
2e630 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50  turn;.  }.  endP
2e640 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
2e650 6c 6c 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e  llIdx[2*pPage->n
2e660 43 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73  Cell - 2];.  ass
2e670 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2e680 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2e690 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2e6a0 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2e6b0 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c  ligned */.  whil
2e6c0 65 28 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b  e( ptr<endPtr ){
2e6d0 0a 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20  .    *(u16*)ptr 
2e6e0 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d  = *(u16*)&ptr[2]
2e6f0 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a  ;.    ptr += 2;.
2e700 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2e710 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
2e720 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2e730 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2e740 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2e750 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2e760 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2e770 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2e780 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2e790 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2e7a0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2e7b0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2e7c0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2e7d0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2e7e0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2e7f0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2e800 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2e810 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2e820 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2e830 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2e840 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2e850 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2e860 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2e870 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2e880 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2e890 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
2e8a0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
2e8b0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2e8c0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
2e8d0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
2e8e0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
2e8f0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
2e900 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
2e910 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
2e920 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
2e930 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
2e940 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
2e950 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
2e960 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
2e970 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2e980 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
2e990 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
2e9a0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
2e9b0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
2e9c0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
2e9d0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
2e9e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2e9f0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
2ea00 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2ea10 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
2ea20 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
2ea30 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
2ea40 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
2ea50 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
2ea60 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
2ea70 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
2ea80 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
2ea90 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
2eaa0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
2eab0 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
2eac0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
2ead0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
2eae0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
2eaf0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
2eb00 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
2eb10 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
2eb20 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
2eb30 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
2eb40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
2eb50 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
2eb60 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
2eb70 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
2eb80 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
2eb90 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
2eba0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
2ebb0 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
2ebc0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
2ebd0 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
2ebe0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
2ebf0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
2ec00 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
2ec10 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
2ec20 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
2ec30 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
2ec40 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
2ec50 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
2ec60 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
2ec70 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
2ec80 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
2ec90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2eca0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
2ecb0 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
2ecc0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
2ecd0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
2ece0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2ecf0 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
2ed00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2ed10 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
2ed20 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
2ed30 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
2ed40 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
2ed50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ed60 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
2ed70 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2ed80 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2ed90 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
2eda0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
2edb0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
2edc0 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
2edd0 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
2ede0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
2edf0 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
2ee00 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20    u8 *endPtr;   
2ee10 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
2ee20 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74  e loop */..  int
2ee30 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
2ee40 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66   ? 4 : 0);..  if
2ee50 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2ee60 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
2ee70 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
2ee80 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
2ee90 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
2eea0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2eeb0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2eec0 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2eed0 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
2eee0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2eef0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
2ef00 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
2ef10 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
2ef20 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2ef30 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
2ef40 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
2ef50 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
2ef60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ef70 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2ef80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2ef90 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
2efa0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
2efb0 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
2efc0 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
2efd0 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
2efe0 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
2eff0 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
2f000 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
2f010 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
2f020 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
2f030 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
2f040 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
2f050 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
2f060 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
2f070 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
2f080 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
2f090 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
2f0a0 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
2f0b0 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
2f0c0 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
2f0d0 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
2f0e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2f0f0 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
2f100 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
2f110 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
2f120 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
2f130 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
2f140 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2f150 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
2f160 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
2f170 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
2f180 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
2f190 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
2f1a0 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2f1b0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2f1c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2f1d0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
2f1e0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
2f1f0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2f200 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
2f210 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
2f220 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
2f230 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
2f240 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
2f250 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
2f260 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
2f270 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
2f280 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
2f290 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  [j] = (u16)i;.  
2f2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
2f2b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f2c0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2f2d0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2f2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f2f0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
2f300 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2f310 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f320 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f330 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2f340 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2f350 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2f360 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
2f370 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
2f380 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
2f390 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2f3a0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
2f3b0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
2f3c0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
2f3d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
2f3e0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
2f3f0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
2f400 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
2f410 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
2f420 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
2f430 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
2f440 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
2f450 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
2f460 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
2f470 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
2f480 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
2f490 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
2f4a0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
2f4b0 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
2f4c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2f4d0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
2f4e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
2f4f0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
2f500 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
2f510 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
2f520 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
2f530 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2f540 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2f550 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2f560 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
2f570 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2f580 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d  ptr = &data[end]
2f590 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26  ;.    endPtr = &
2f5a0 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61  data[ins];.    a
2f5b0 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2f5c0 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2f5d0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2f5e0 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2f5f0 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20   aligned */.    
2f600 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74  while( ptr>endPt
2f610 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36  r ){.      *(u16
2f620 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26  *)ptr = *(u16*)&
2f630 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
2f640 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  tr -= 2;.    }. 
2f650 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2f660 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2f670 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2f680 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2f690 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2f6a0 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2f6b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2f6c0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2f6d0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2f6e0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2f6f0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2f700 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2f710 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2f720 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2f730 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2f740 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2f750 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2f760 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2f770 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
2f780 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2f790 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
2f7a0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2f7b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2f7c0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
2f7d0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
2f7e0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
2f7f0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
2f800 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
2f810 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
2f820 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
2f830 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f840 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
2f850 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2f860 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
2f870 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
2f880 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
2f890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
2f8a0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
2f8b0 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
2f8c0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2f8d0 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
2f8e0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
2f8f0 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
2f900 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
2f910 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
2f920 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2f940 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
2f950 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
2f960 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2f970 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
2f980 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
2f990 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
2f9a0 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2f9b0 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
2f9c0 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
2f9d0 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
2f9e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2f9f0 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
2fa00 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2fa10 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
2fa20 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
2fa30 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2fa40 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
2fa50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2fa60 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
2fa70 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2fa80 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
2fa90 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
2faa0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2fab0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2fac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2fad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2fae0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2faf0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
2fb00 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69  >=0 && nCell<=(i
2fb10 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2fb20 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20  ->pBt).         
2fb30 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45     && (int)MX_CE
2fb40 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2fb50 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74  10921);.  assert
2fb60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2fb70 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2fb80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2fb90 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2fba0 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2fbb0 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2fbc0 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2fbd0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2fbe0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2fbf0 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  rt( get2byteNotZ
2fc00 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
2fc10 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
2fc20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61   pCellptr = &pPa
2fc30 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  ge->aCellIdx[nCe
2fc40 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2fc50 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2fc60 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2fc70 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31  =0; i--){.    u1
2fc80 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b  6 sz = aSize[i];
2fc90 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
2fca0 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
2fcb0 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32   -= sz;.    put2
2fcc0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2fcd0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2fce0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2fcf0 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2fd00 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32   sz);.  }.  put2
2fd10 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2fd20 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
2fd30 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2fd40 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
2fd50 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2fd60 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
2fd70 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
2fd80 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
2fd90 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
2fda0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2fdb0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
2fdc0 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
2fdd0 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
2fde0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
2fdf0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
2fe00 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
2fe10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2fe20 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2fe30 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
2fe40 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
2fe50 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2fe60 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2fe70 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
2fe80 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
2fe90 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
2fea0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
2feb0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
2fec0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
2fed0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2fee0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
2fef0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
2ff00 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
2ff10 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
2ff20 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
2ff30 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
2ff40 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
2ff50 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
2ff60 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
2ff70 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2ff80 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
2ff90 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
2ffa0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
2ffb0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
2ffc0 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
2ffd0 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
2ffe0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
2fff0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
30000 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
30010 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
30020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
30030 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
30040 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
30050 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
30060 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
30070 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
30080 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
30090 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
300a0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
300b0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
300c0 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
300d0 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
300e0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
300f0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
30100 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
30110 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
30120 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
30130 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
30140 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
30150 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
30160 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
30170 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
30180 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
30190 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
301a0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
301b0 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  to balance the 3
301c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
301d0 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
301e0 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
301f0 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
30200 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
30210 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
30220 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
30230 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
30240 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
30250 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
30260 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
30270 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
30280 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
30290 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
302a0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
302b0 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
302c0 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
302d0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
302e0 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
302f0 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
30300 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
30310 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
30320 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
30330 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
30340 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
30350 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
30360 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
30370 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
30380 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
30390 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
303a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
303b0 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
303c0 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
303d0 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
303e0 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
303f0 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
30400 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
30410 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
30420 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
30430 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
30440 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
30450 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
30460 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
30470 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
30480 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
30490 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
304a0 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
304b0 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
304c0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
304d0 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
304e0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
304f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
30500 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
30510 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
30520 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
30530 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
30540 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
30550 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
30560 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
30570 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
30580 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
305a0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
305b0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
305c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
305e0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
305f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30610 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30620 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
30630 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
30640 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
30650 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
30660 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
30670 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30680 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
30690 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
306a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
306b0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
306c0 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63   /* This error c
306d0 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20  ondition is now 
306e0 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
306f0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75  reaching this fu
30700 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
30710 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
30720 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30730 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
30740 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
30750 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
30760 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
30770 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
30780 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
30790 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
307a0 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
307b0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
307c0 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
307d0 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
307e0 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
307f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
30800 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
30810 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
30820 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
30830 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
30840 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
30850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30860 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
30870 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
30880 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
30890 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  l = pPage->apOvf
308a0 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a  l[0];.    u16 sz
308b0 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
308c0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
308d0 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
308e0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
308f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30900 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
30910 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
30920 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
30930 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
30940 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
30950 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
30960 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
30970 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
30980 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
30990 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
309a0 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
309b0 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
309c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
309d0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
309e0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
309f0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
30a00 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
30a10 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
30a20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
30a30 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
30a40 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
30a50 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
30a60 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
30a70 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
30a80 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
30a90 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
30aa0 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
30ab0 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
30ac0 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
30ad0 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
30ae0 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
30af0 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
30b00 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
30b10 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
30b20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
30b30 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
30b40 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
30b50 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
30b60 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
30b70 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
30b80 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
30b90 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
30ba0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
30bb0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
30bc0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
30bd0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
30be0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
30bf0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
30c00 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
30c10 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
30c20 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
30c30 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
30c40 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
30c50 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
30c60 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
30c70 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
30c80 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
30c90 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
30ca0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
30cb0 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
30cc0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
30cd0 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
30ce0 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
30cf0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
30d00 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
30d10 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
30d20 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
30d30 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
30d40 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
30d50 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
30d60 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
30d70 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
30d80 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
30d90 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
30da0 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
30db0 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
30dc0 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
30dd0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
30de0 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
30df0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
30e00 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
30e10 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
30e20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
30e30 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
30e40 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
30e50 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
30e60 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
30e70 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
30e80 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
30e90 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
30ea0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
30eb0 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
30ec0 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
30ed0 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
30ee0 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
30ef0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
30f00 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
30f10 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
30f20 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
30f30 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
30f40 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
30f50 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
30f60 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
30f70 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
30f80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
30f90 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
30fa0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
30fb0 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
30fc0 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
30fd0 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
30fe0 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
30ff0 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
31000 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
31010 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
31020 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
31030 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
31040 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
31050 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
31060 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
31070 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
31080 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
31090 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
310a0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
310b0 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
310c0 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
310d0 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
310e0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
310f0 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
31100 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
31110 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
31120 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
31130 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
31140 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
31150 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
31160 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
31170 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
31180 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
31190 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
311a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
311b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
311c0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
311d0 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
311e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
311f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
31200 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
31210 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
31220 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
31230 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
31240 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
31250 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
31260 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
31270 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
31280 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
31290 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
312a0 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
312b0 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
312c0 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
312d0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
312e0 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
312f0 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
31300 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
31310 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
31320 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
31330 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
31340 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
31350 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
31360 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31370 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
31380 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
31390 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
313a0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
313b0 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
313c0 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
313d0 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
313e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
313f0 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
31400 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
31410 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
31420 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
31430 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
31440 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
31450 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
31460 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
31470 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
31480 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
31490 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
314a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
314b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
314c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
314d0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
314e0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
314f0 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
31500 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
31510 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
31520 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
31530 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
31540 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
31550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
31560 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
31570 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
31580 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
31590 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
315a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
315b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
315c0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
315d0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
315e0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
315f0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
31600 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
31610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31620 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
31630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
31640 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
31650 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
31660 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
31670 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
31680 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
31690 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
316a0 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
316b0 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
316c0 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
316d0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
316e0 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
316f0 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
31700 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
31710 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
31720 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
31730 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
31740 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
31750 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
31760 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
31770 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
31780 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
31790 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
317a0 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
317b0 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
317c0 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
317d0 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
317e0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
317f0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
31800 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
31810 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
31820 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
31830 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61  ge.apOvfl[] arra
31840 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
31850 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
31860 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
31870 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
31880 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
31890 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
318a0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
318b0 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
318c0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
318d0 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
318e0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
318f0 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
31900 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
31910 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
31920 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
31930 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
31940 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
31950 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
31960 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
31970 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
31980 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
31990 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
319a0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
319b0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
319c0 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
319d0 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
319e0 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
319f0 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
31a00 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
31a10 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
31a20 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
31a30 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
31a40 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
31a50 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
31a60 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
31a70 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
31a80 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
31a90 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
31aa0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
31ab0 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
31ac0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
31ad0 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
31ae0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
31af0 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
31b00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
31b10 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
31b20 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
31b30 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
31b40 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
31b50 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
31b60 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
31b70 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
31b80 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
31b90 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
31ba0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
31bb0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
31bc0 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
31bd0 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
31be0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
31bf0 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
31c00 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
31c10 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
31c20 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
31c30 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
31c40 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
31c50 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
31c60 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
31c70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
31c80 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
31c90 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
31ca0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
31cb0 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
31cc0 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
31cd0 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
31ce0 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
31cf0 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
31d00 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
31d10 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
31d20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
31d30 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
31d40 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
31d50 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
31d60 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
31d70 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
31d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31d90 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
31da0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
31db0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
31dc0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
31dd0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
31de0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
31df0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
31e00 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
31e10 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
31e20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
31e30 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
31e40 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
31e50 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
31e60 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31e70 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
31e80 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
31e90 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
31ea0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
31eb0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
31ec0 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
31ed0 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
31ee0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
31ef0 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
31f00 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
31f10 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
31f20 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
31f30 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
31f40 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
31f50 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
31f60 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
31f70 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
31f80 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
31f90 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
31fa0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
31fb0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
31fc0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
31fd0 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
31fe0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
31ff0 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
32000 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
32010 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
32020 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
32030 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
32040 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
32050 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
32060 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
32070 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
32080 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
32090 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
320a0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
320b0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
320c0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
320d0 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
320e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
320f0 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
32100 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
32110 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
32120 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
32130 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
32140 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
32150 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
32160 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
32170 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
32180 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
32190 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
321a0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
321b0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
321c0 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
321d0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
321e0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
321f0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
32200 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
32210 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
32220 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
32230 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
32240 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
32250 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
32260 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
32270 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
32280 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
32290 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
322a0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
322b0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
322c0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
322d0 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
322e0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
322f0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
32300 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
32310 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
32320 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
32330 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
32340 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
32350 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
32360 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
32370 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
32380 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
32390 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
323a0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
323b0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
323c0 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
323d0 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
323e0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
323f0 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
32400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
32410 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
32420 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
32430 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
32440 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
32450 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
32460 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
32470 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
32480 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
32490 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
324a0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
324b0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
324c0 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
324d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
324e0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
324f0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
32500 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
32510 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
32520 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
32530 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
32540 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
32550 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
32560 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
32570 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
32580 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
32590 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
325a0 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
325b0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
325c0 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
325d0 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
325e0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
325f0 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
32600 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
32610 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
32620 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
32630 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
32640 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
32650 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
32660 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
32670 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
32680 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
32690 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
326a0 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
326b0 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
326c0 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
326d0 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
326e0 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
326f0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
32700 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
32710 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  M..*/.#if define
32720 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f  d(_MSC_VER) && _
32730 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20  MSC_VER >= 1700 
32740 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52  && defined(_M_AR
32750 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d  M).#pragma optim
32760 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e  ize("", off).#en
32770 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62  dif.static int b
32780 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
32790 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
327a0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
327b0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
327c0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
327d0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
327e0 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32800 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
32810 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
32820 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
32830 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
32840 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
32850 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
32860 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
32870 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
32880 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
32890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
328a0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
328b0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
328c0 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20  int bBulk       
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
328f0 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20  call is part of 
32900 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29  a bulk load */.)
32910 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32920 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
32930 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
32940 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
32950 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
32960 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
32970 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
32980 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
32990 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
329a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
329b0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
329c0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
329d0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
329e0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
329f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a00 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
32a10 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
32a20 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
32a30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a40 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
32a50 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
32a60 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
32a70 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
32a80 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
32a90 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
32aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
32ab0 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
32ac0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
32ad0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
32ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
32af0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
32b00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
32b10 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
32b20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
32b30 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
32b40 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
32b50 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b70 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
32b80 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
32b90 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
32ba0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
32bb0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
32bc0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
32bd0 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
32be0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
32bf0 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
32c00 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
32c10 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
32c20 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
32c30 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
32c40 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
32c50 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
32c60 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
32c70 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
32c80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
32c90 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
32ca0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
32cb0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
32cc0 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
32cd0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
32ce0 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
32cf0 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
32d00 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
32d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
32d20 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
32d30 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
32d40 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
32d50 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
32d60 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
32d70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
32d80 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
32d90 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
32da0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
32db0 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
32dc0 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
32dd0 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
32de0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
32df0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
32e00 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
32e10 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
32e20 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
32e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
32e40 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
32e50 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
32e60 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
32e70 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
32e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
32e90 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
32ea0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
32eb0 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
32ec0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
32ed0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
32ee0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
32ef0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
32f00 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
32f10 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
32f20 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
32f30 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
32f40 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
32f50 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
32f60 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
32f70 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
32f80 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
32f90 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32fa0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
32fb0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
32fc0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
32fd0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
32ff0 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
33000 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
33010 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
33020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33030 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
33040 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
33050 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
33060 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
33070 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
33080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33090 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
330a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
330b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
330c0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
330d0 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
330e0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
330f0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
33100 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
33110 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
33120 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
33130 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
33140 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
33150 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
33160 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
33170 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
33180 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
33190 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
331a0 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
331b0 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
331c0 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
331d0 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
331e0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
331f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
33200 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
33210 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
33220 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
33230 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
33240 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
33250 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
33260 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
33270 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
33280 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33290 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
332a0 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72  >aiOvfl[0]==iPar
332b0 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
332c0 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
332d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
332e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
332f0 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
33300 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
33310 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
33320 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
33330 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
33340 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
33350 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
33360 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
33370 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
33380 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
33390 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
333a0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
333b0 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
333c0 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
333d0 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
333e0 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
333f0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
33400 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
33410 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
33420 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
33430 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
33440 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
33450 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
33460 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
33470 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
33480 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
33490 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
334a0 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
334b0 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
334c0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
334d0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
334e0 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
334f0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
33500 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
33510 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66  t page, since if
33520 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65   any existed the
33530 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65  y will.  ** have
33540 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
33550 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20  moved..  */.  i 
33560 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
33570 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
33580 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
33590 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
335a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
335b0 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30  assert( bBulk==0
335c0 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a   || bBulk==1 );.
335d0 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49      if( iParentI
335e0 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  dx==0 ){        
335f0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
33600 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d  nxDiv = 0;.    }
33610 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74  else if( iParent
33620 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  Idx==i ){.      
33630 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c  nxDiv = i-2+bBul
33640 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
33650 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c      assert( bBul
33660 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78  k==0 );.      nx
33670 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
33680 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  -1;.    }.    i 
33690 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20  = 2-bBulk;.  }. 
336a0 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69   nOld = i+1;.  i
336b0 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72  f( (i+nxDiv-pPar
336c0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d  ent->nOverflow)=
336d0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
336e0 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ){.    pRight = 
336f0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
33700 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
33710 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et+8];.  }else{.
33720 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e      pRight = fin
33730 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
33740 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
33750 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a  nOverflow);.  }.
33760 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
33770 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69  e(pRight);.  whi
33780 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20  le( 1 ){.    rc 
33790 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
337a0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f  (pBt, pgno, &apO
337b0 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69  ld[i], 0);.    i
337c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d  f( rc ){.      m
337d0 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
337e0 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
337f0 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67  Page*));.      g
33800 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
33810 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  nup;.    }.    n
33820 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
33830 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
33840 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
33850 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29  w;.    if( (i--)
33860 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
33870 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70    if( i+nxDiv==p
33880 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30  Parent->aiOvfl[0
33890 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ] && pParent->nO
338a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
338b0 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
338c0 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  ent->apOvfl[0];.
338d0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
338e0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
338f0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
33900 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
33910 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
33920 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
33930 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
33940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33950 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
33960 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
33970 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
33980 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  Overflow);.     
33990 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
339a0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
339b0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
339c0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
339d0 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20  , apDiv[i]);..  
339e0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
339f0 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61  cell from the pa
33a00 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76  rent page. apDiv
33a10 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  [i] still points
33a20 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
33a30 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65   cell within the
33a40 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68   parent, even th
33a50 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e  ough it has been
33a60 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20   dropped..      
33a70 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20  ** This is safe 
33a80 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67  because dropping
33a90 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65   a cell only ove
33aa0 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73  rwrites the firs
33ab0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
33ac0 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64  bytes of it, and
33ad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
33ae0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65  oes not need the
33af0 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
33b00 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
33b10 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  e divider cell. 
33b20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  So the pointer i
33b30 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20  s safe to use.  
33b40 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e      ** later on.
33b50 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20    .      **.    
33b60 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20    ** But not if 
33b70 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65  we are in secure
33b80 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e  -delete mode. In
33b90 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
33ba0 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ode,.      ** th
33bb0 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75  e dropCell() rou
33bc0 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72  tine will overwr
33bd0 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63  ite the entire c
33be0 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e  ell with zeroes.
33bf0 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
33c00 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72  s case, temporar
33c10 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c  ily copy the cel
33c20 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c  l into the aOvfl
33c30 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a  Space[].      **
33c40 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c   buffer. It will
33c50 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61   be copied out a
33c60 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20  gain as soon as 
33c70 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66  the aSpace[] buf
33c80 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  fer.      ** is 
33c90 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
33ca0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74       if( pBt->bt
33cb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
33cc0 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
33cd0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
33ce0 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
33cf0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
33d00 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51  T(apDiv[i]) - SQ
33d10 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
33d20 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
33d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f  .        if( (iO
33d40 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e  ff+szNew[i])>(in
33d50 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
33d60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
33d70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33d80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
33d90 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
33da0 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
33db0 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
33dc0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
33dd0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
33de0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33df0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
33e00 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20  vflSpace[iOff], 
33e10 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b  apDiv[i], szNew[
33e20 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  i]);.          a
33e30 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
33e40 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
33e50 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
33e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33e70 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  }.      dropCell
33e80 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
33e90 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
33ea0 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20  flow, szNew[i], 
33eb0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
33ec0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
33ed0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
33ee0 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
33ef0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
33f00 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
33f10 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
33f20 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
33f30 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
33f40 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
33f50 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
33f60 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
33f70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
33f80 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
33f90 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
33fa0 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
33fb0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
33fc0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
33fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
33fe0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
33ff0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
34000 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
34010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
34020 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
34030 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
34040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
34060 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
34070 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
34080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
340a0 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
340b0 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
340c0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
340d0 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
340e0 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
340f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
34100 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34110 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
34120 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
34130 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
34140 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
34150 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
34160 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
34170 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
34180 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
34190 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
341a0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
341b0 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
341c0 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
341d0 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
341e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
341f0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
34200 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
34210 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
34220 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
34230 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
34240 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
34250 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
34260 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69   remove the divi
34270 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66  der cells.  ** f
34280 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
34290 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
342a0 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
342b0 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
342c0 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
342d0 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
342e0 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
342f0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
34300 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
34310 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
34320 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
34330 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
34340 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
34350 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
34360 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
34370 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
34380 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
34390 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
343a0 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
343b0 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
343c0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
343d0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
343e0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
343f0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
34400 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
34410 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
34420 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
34430 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
34440 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
34450 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
34460 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
34470 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
34480 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
34490 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
344a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
344b0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a   apOld[0]->leaf*
344c0 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
344d0 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74  apOld[0]->hasDat
344e0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
344f0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
34500 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
34510 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
34520 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
34530 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
34540 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
34550 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
34560 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
34570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
34580 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
34590 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
345a0 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
345b0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
345c0 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
345d0 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
345e0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
345f0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
34600 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
34610 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
34620 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
34630 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
34640 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
34650 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
34660 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
34670 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
34680 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
34690 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
346a0 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
346b0 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
346c0 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
346d0 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
346e0 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
346f0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
34700 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
34710 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
34720 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
34730 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
34740 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
34750 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
34760 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
34770 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
34780 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
34790 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
347a0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
347b0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
347c0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
347d0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
347e0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
347f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
34800 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70     u8 *aData = p
34810 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  Old->aData;.    
34820 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d    u16 maskPage =
34830 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b   pOld->maskPage;
34840 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  .      u16 cellO
34850 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65  ffset = pOld->ce
34860 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  llOffset;.      
34870 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
34880 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
34890 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
348a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
348b0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
348c0 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44   = findCellv2(aD
348d0 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63  ata, maskPage, c
348e0 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20  ellOffset, j);. 
348f0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
34900 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
34910 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
34920 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
34930 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
34940 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20  }.    }       . 
34950 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
34960 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
34970 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
34980 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
34990 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
349a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
349b0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
349c0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
349d0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
349e0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
349f0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
34a00 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
34a10 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
34a20 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32  =pBt->maxLocal+2
34a30 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
34a40 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69  t( iSpace1 <= (i
34a50 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
34a60 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
34a70 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
34a80 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
34a90 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
34aa0 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
34ab0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
34ac0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
34ad0 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
34ae0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
34af0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34b00 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
34b10 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
34b20 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
34b30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
34b40 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
34b50 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
34b60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
34b70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
34b80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
34b90 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
34ba0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
34bb0 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
34bc0 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
34bd0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
34be0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
34bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
34c00 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
34c10 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
34c20 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
34c30 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
34c40 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
34c50 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
34c60 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
34c70 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
34c80 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
34c90 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
34ca0 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
34cb0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
34cc0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
34cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34ce0 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
34cf0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
34d00 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
34d10 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
34d20 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
34d30 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
34d40 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
34d50 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
34d60 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
34d70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
34d80 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
34d90 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
34da0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
34db0 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
34dc0 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
34dd0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
34de0 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
34df0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
34e00 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
34e10 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
34e20 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
34e30 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
34e40 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
34e50 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
34e60 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
34e70 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
34e80 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
34e90 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
34ea0 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
34eb0 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
34ec0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
34ed0 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
34ee0 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
34ef0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
34f00 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
34f10 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
34f20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
34f30 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
34f40 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
34f50 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
34f60 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
34f70 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
34f80 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
34f90 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
34fa0 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
34fb0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
34fc0 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
34fd0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
34fe0 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
34ff0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
35000 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
35010 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
35020 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
35030 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
35040 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
35050 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
35060 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
35070 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
35080 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
35090 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
350a0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
350b0 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
350c0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
350d0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
350e0 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
350f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35100 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
35110 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
35120 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
35130 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
35140 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
35150 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
35160 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
35170 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
35180 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
35190 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
351a0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
351b0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
351c0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
351d0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
351e0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
351f0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
35200 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
35210 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
35220 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
35230 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
35240 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
35250 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
35260 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
35270 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
35280 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
35290 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
352a0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
352b0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
352c0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
352d0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
352e0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
352f0 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
35300 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
35310 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
35320 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
35330 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
35340 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
35350 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
35360 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
35370 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
35380 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
35390 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
353a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
353b0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
353c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
353d0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
353e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
353f0 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
35400 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
35410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35420 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
35430 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
35440 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
35450 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
35460 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
35470 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
35480 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
35490 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
354a0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
354b0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
354c0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
354d0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
354e0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
354f0 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
35500 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
35510 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20  Right==0 .      
35520 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73   || (!bBulk && s
35530 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
35540 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
35550 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29  ll[r]+2)) .    )
35560 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
35570 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
35580 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
35590 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
355a0 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
355b0 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
355c0 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
355d0 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
355e0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
355f0 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
35600 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
35610 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
35620 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
35630 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
35640 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
35650 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
35660 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
35670 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
35680 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
35690 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
356a0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
356b0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
356c0 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
356d0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
356e0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a   that page..  **
356f0 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54  .  ** UPDATE:  T
35700 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
35710 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  w is not necessa
35720 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65  rily true if the
35730 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
35740 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
35750 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20   The corruption 
35760 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64  will be detected
35770 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
35780 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73  ter.  ** in this
35790 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68   procedure so th
357a0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
357b0 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f  o act upon it no
357c0 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  w..  */.#if 0.  
357d0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
357e0 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
357f0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
35800 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
35810 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43  ;.#endif..  TRAC
35820 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
35830 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20  : %d %d %d  ",. 
35840 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e     apOld[0]->pgn
35850 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  o, .    nOld>=2 
35860 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f  ? apOld[1]->pgno
35870 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
35880 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67  3 ? apOld[2]->pg
35890 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20  no : 0.  ));..  
358a0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
358b0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
358c0 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
358d0 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
358e0 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b   */.  if( apOld[
358f0 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20  0]->pgno<=1 ){. 
35900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35910 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35920 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
35930 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67  eanup;.  }.  pag
35940 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30  eFlags = apOld[0
35950 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  ]->aData[0];.  f
35960 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
35970 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
35980 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
35990 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
359a0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
359b0 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
359c0 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
359d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
359e0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
359f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35a00 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
35a10 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
35a20 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
35a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
35a40 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
35a50 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
35a60 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
35a70 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62  &pNew, &pgno, (b
35a80 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29  Bulk ? 1 : pgno)
35a90 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
35aa0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
35ab0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
35ac0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
35ad0 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
35ae0 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
35af0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
35b00 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
35b10 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
35b20 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
35b30 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
35b40 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
35b50 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
35b60 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
35b70 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
35b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
35b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35ba0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
35bb0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
35bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
35be0 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
35bf0 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
35c00 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
35c10 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
35c20 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
35c30 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64    freePage(apOld
35c40 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  [i], &rc);.    i
35c50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
35c60 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
35c70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
35c80 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
35c90 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
35ca0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
35cb0 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
35cc0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
35cd0 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
35ce0 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
35cf0 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
35d00 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
35d10 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
35d20 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
35d30 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
35d40 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
35d50 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
35d60 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
35d70 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
35d80 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
35d90 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
35da0 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
35db0 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
35dc0 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
35dd0 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
35de0 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
35df0 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
35e00 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
35e10 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
35e20 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
35e30 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
35e40 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
35e50 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
35e60 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
35e70 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
35e80 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
35e90 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
35ea0 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
35eb0 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
35ec0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
35ed0 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
35ee0 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
35ef0 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
35f00 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
35f10 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
35f20 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
35f30 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d     if( apNew[j]-
35f40 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29  >pgno<(unsigned)
35f50 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
35f60 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
35f70 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a    minV = apNew[j
35f80 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ]->pgno;.      }
35f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
35fa0 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d  inI>i ){.      M
35fb0 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
35fc0 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
35fd0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
35fe0 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
35ff0 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
36000 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
36010 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20  .  TRACE(("new: 
36020 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
36030 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
36040 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77  d)\n",.    apNew
36050 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77  [0]->pgno, szNew
36060 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
36070 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e   ? apNew[1]->pgn
36080 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  o : 0, nNew>=2 ?
36090 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
360a0 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e     nNew>=3 ? apN
360b0 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[2]->pgno : 0,
360c0 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
360d0 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
360e0 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d  w>=4 ? apNew[3]-
360f0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36100 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
36110 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
36120 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20   apNew[4]->pgno 
36130 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
36140 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
36150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36160 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36170 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
36180 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ge) );.  put4byt
36190 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b  e(pRight, apNew[
361a0 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
361b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
361c0 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
361d0 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
361e0 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
361f0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
36200 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
36210 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
36220 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
36230 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
36240 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
36250 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
36260 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
36270 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
36280 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
36290 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
362a0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
362b0 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ls );.    zeroPa
362c0 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
362d0 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
362e0 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
362f0 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
36300 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
36310 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
36320 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
36330 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
36340 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
36350 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
36360 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
36370 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
36380 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
36390 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
363a0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
363b0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
363c0 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
363d0 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
363e0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
363f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
36400 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
36410 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20  rt( i<nNew-1 || 
36420 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  j==nCell );.    
36430 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20  if( j<nCell ){. 
36440 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
36450 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
36460 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
36470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
36480 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
36490 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
364a0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
364b0 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
364c0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
364d0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66     pTemp = &aOvf
364e0 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63  lSpace[iOvflSpac
364f0 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e];.      if( !p
36500 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
36510 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
36520 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
36530 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  ll, 4);.      }e
36540 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
36550 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
36560 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
36570 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
36580 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
36590 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
365a0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
365b0 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
365c0 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
365d0 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
365e0 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
365f0 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
36600 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
36610 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
36620 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
36630 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
36640 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
36650 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
36660 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
36670 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
36680 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
36690 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  -;.        btree
366a0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
366b0 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
366c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
366d0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
366e0 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75       sz = 4 + pu
366f0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
36700 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  ], info.nKey);. 
36710 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
36720 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
36730 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
36740 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62  4;.        /* Ob
36750 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e  scure case for n
36760 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65  on-leaf-data tre
36770 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  es: If the cell 
36780 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20  at pCell was.   
36790 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
367a0 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c  ly stored on a l
367b0 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74  eaf node, and it
367c0 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20  s reported size 
367d0 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a  was 4.        **
367e0 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20   bytes, then it 
367f0 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20  may actually be 
36800 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
36810 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73  s .        ** (s
36820 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ee btreeParseCel
36830 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
36840 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
36850 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
36860 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
36870 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
36880 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
36890 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
368a0 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
368b0 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
368c0 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
368d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
368e0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
368f0 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
36900 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
36910 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
36920 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
36930 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
36940 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
36950 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
36960 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
36970 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
36980 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
36990 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
369a0 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
369b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
369c0 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
369d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
369e0 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
369f0 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
36a00 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
36a10 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
36a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36a30 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53    }.      iOvflS
36a40 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
36a50 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
36a60 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29  t->maxLocal+23 )
36a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
36a80 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69  iOvflSpace <= (i
36a90 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
36aa0 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74   );.      insert
36ab0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
36ac0 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
36ad0 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e  pTemp, pNew->pgn
36ae0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
36af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36b00 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
36b10 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
36b20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36b30 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36b40 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
36b50 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
36b60 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
36b70 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
36b80 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
36b90 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
36ba0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
36bb0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
36bc0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
36bd0 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
36be0 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
36bf0 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
36c00 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
36c10 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
36c20 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
36c30 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
36c40 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
36c50 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
36c60 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
36c70 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
36c80 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
36c90 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
36ca0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
36cb0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
36cc0 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
36cd0 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
36ce0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
36cf0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
36d00 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
36d10 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
36d20 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
36d30 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
36d40 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
36d50 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
36d60 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
36d70 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
36d80 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
36d90 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
36da0 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
36db0 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
36dc0 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
36dd0 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
36de0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
36df0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
36e00 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
36e10 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
36e20 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
36e30 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
36e40 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
36e50 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
36e60 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
36e70 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
36e80 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
36e90 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
36ea0 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
36eb0 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
36ec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
36ed0 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
36ee0 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
36ef0 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
36f00 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
36f10 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
36f20 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
36f30 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
36f40 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
36f50 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
36f60 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
36f70 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
36f80 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
36f90 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
36fa0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
36fb0 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
36fc0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
36fd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36fe0 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
36ff0 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
37000 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
37010 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
37020 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
37030 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
37040 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  2) .    );.    c
37050 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61  opyNodeContent(a
37060 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74  pNew[0], pParent
37070 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65  , &rc);.    free
37080 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26  Page(apNew[0], &
37090 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
370a0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
370b0 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20  .    /* Fix the 
370c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
370d0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20  ies for all the 
370e0 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20  cells that were 
370f0 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20  shifted around. 
37100 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
37110 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
37120 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
37130 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37140 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
37150 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
37160 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  th by this routi
37170 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73  ne. Some of thes
37180 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  e have been set 
37190 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20  already, but.   
371a0 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f   ** many have no
371b0 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
371c0 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20   is a summary:. 
371d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31     **.    **   1
371e0 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73  ) The entries as
371f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65  sociated with ne
37200 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  w sibling pages 
37210 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20  that were not.  
37220 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e    **      siblin
37230 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  gs when this fun
37240 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
37250 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72  . These have alr
37260 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  eady.    **     
37270 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f   been set. We do
37280 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72  n't need to worr
37290 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c  y about old sibl
372a0 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20  ings that were. 
372b0 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64     **      moved
372c0 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
372d0 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65  t - the freePage
372e0 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65  () code has take
372f0 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  n care.    **   
37300 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20     of those..   
37310 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20   **.    **   2) 
37320 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  The pointer-map 
37330 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
37340 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
37350 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  t overflow.    *
37360 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61  *      page in a
37370 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ny overflow chai
37380 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64  ns used by new d
37390 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68  ivider cells. Th
373a0 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ese .    **     
373b0 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61   have also alrea
373c0 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61  dy been taken ca
373d0 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73  re of by the ins
373e0 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a  ertCell() code..
373f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37400 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  3) If the siblin
37410 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37420 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
37430 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a   child pages of.
37440 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c      **      cell
37450 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
37460 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61  sibling pages ma
37470 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
37480 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
37490 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20   **   4) If the 
374a0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
374b0 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69  e not internal i
374c0 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65  ntkey nodes, the
374d0 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20  n any.    **    
374e0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
374f0 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63   used by these c
37500 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ells may need to
37510 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20   be updated.    
37520 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61  **      (interna
37530 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e  l intkey nodes n
37540 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69  ever contain poi
37550 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f  nters to overflo
37560 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a  w pages)..    **
37570 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20  .    **   5) If 
37580 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
37590 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
375a0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
375b0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20  er-map.    **   
375c0 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74     entries for t
375d0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
375e0 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62  ages of each sib
375f0 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20  ling may need.  
37600 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20    **      to be 
37610 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
37620 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61      ** Cases 1 a
37630 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77  nd 2 are dealt w
37640 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68  ith above by oth
37650 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78  er code. The nex
37660 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64  t.    ** block d
37670 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20  eals with cases 
37680 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20  3 and 4 and the 
37690 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20  one after that, 
376a0 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20  case 5. Since.  
376b0 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70    ** setting a p
376c0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
376d0 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
376e0 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
376f0 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a  tion, this.    *
37700 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73  * code only sets
37710 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
37720 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f  ries for child o
37730 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
37740 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a   that have.    *
37750 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64  * actually moved
37760 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20   between pages. 
37770 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
37780 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d  *pNew = apNew[0]
37790 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
377a0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b  Old = apCopy[0];
377b0 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c  .    int nOverfl
377c0 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
377d0 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e  flow;.    int iN
377e0 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e  extOld = pOld->n
377f0 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77  Cell + nOverflow
37800 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66  ;.    int iOverf
37810 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77  low = (nOverflow
37820 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b   ? pOld->aiOvfl[
37830 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  0] : -1);.    j 
37840 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
37850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37860 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
37870 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
37880 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
37890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
378b0 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
378c0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
378d0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
378e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
378f0 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
37900 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
37910 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
37920 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
37930 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
37940 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
37950 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
37960 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
37970 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
37980 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
37990 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
379a0 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
379b0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
379c0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
379d0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
379e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
379f0 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61 79  ert( j+1 < Array
37a00 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b 0a  Size(apCopy) );.
37a10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37a20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20 20  j+1 < nOld );.  
37a30 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43        pOld = apC
37a40 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20  opy[++j];.      
37a50 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b    iNextOld = i +
37a60 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
37a70 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d  d->nCell + pOld-
37a80 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
37a90 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
37aa0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
37ab0 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d       nOverflow =
37ac0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
37ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  ;.          iOve
37ae0 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61  rflow = i + !lea
37af0 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69  fData + pOld->ai
37b00 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Ovfl[0];.       
37b10 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76   }.        isDiv
37b20 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61  ider = !leafData
37b30 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
37b40 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
37b50 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c  low>0 || iOverfl
37b60 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73  ow<i );.      as
37b70 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32  sert(nOverflow<2
37b80 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c   || pOld->aiOvfl
37b90 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66  [0]==pOld->aiOvf
37ba0 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61  l[1]-1);.      a
37bb0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
37bc0 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  3 || pOld->aiOvf
37bd0 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76  l[1]==pOld->aiOv
37be0 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20  fl[2]-1);.      
37bf0 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77  if( i==iOverflow
37c00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69   ){.        isDi
37c10 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  vider = 1;.     
37c20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66     if( (--nOverf
37c30 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  low)>0 ){.      
37c40 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b      iOverflow++;
37c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37c60 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d   }..      if( i=
37c70 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20  =cntNew[k] ){.  
37c80 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
37c90 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
37ca0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
37cb0 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
37cc0 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  on new.        *
37cd0 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b  * sibling page k
37ce0 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
37cf0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
37d00 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
37d10 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
37d20 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
37d30 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65   is a divider ce
37d40 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
37d50 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b  pNew = apNew[++k
37d60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
37d70 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69  leafData ) conti
37d80 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
37d90 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c     assert( j<nOl
37da0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
37db0 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20  t( k<nNew );..  
37dc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65      /* If the ce
37dd0 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  ll was originall
37de0 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28  y divider cell (
37df0 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20  and is not now) 
37e00 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f  or.      ** an o
37e10 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72  verflow cell, or
37e20 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   if the cell was
37e30 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69   located on a di
37e40 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a  fferent sibling.
37e50 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65        ** page be
37e60 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69  fore the balanci
37e70 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  ng, then the poi
37e80 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
37e90 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
37ea0 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68    ** with any ch
37eb0 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
37ec0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
37ed0 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20   updated.  */.  
37ee0 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65      if( isDivide
37ef0 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21  r || pOld->pgno!
37f00 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
37f10 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
37f20 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
37f30 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
37f40 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
37f50 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
37f60 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
37f70 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
37f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
37f90 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77  ( szCell[i]>pNew
37fa0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
37fb0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
37fc0 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61  tOvflPtr(pNew, a
37fd0 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a  pCell[i], &rc);.
37fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37ff0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
38000 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
38010 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
38020 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
38030 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79  .        u32 key
38040 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e   = get4byte(&apN
38050 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29  ew[i]->aData[8])
38060 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
38070 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54  Put(pBt, key, PT
38080 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
38090 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  w[i]->pgno, &rc)
380a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
380b0 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68  .#if 0.    /* Th
380c0 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  e ptrmapCheckPag
380d0 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73  es() contains as
380e0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
380f0 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68  s that verify th
38100 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f  at.    ** all po
38110 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20  inter map pages 
38120 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c  are set correctl
38130 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66  y. This is helpf
38140 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a  ul while .    **
38150 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73   debugging. This
38160 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61   is usually disa
38170 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63  bled because a c
38180 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
38190 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65  may.    ** cause
381a0 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
381b0 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20  tement to fail. 
381c0 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68   */.    ptrmapCh
381d0 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20  eckPages(apNew, 
381e0 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61  nNew);.    ptrma
381f0 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61  pCheckPages(&pPa
38200 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66  rent, 1);.#endif
38210 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
38220 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
38230 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
38240 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20  ANCE: finished: 
38250 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
38260 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
38270 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c       nOld, nNew,
38280 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a   nCell));..  /*.
38290 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
382a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
382b0 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
382c0 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63  nup:.  sqlite3Sc
382d0 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
382e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
382f0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
38300 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
38310 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
38320 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
38330 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
38340 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
38350 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
38360 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  .}.#if defined(_
38370 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
38380 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20  _VER >= 1700 && 
38390 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a  defined(_M_ARM).
383a0 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65  #pragma optimize
383b0 28 22 22 2c 20 6f 6e 29 0a 23 65 6e 64 69 66 0a  ("", on).#endif.
383c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
383d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
383e0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  when the root pa
383f0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73  ge of a b-tree s
38400 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f  tructure is.** o
38410 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65  verfull (has one
38420 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
38430 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20  w pages)..**.** 
38440 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  A new child page
38450 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is all