/ Hex Artifact Content
Login

Artifact 02064f49cd18e8d6ca0218fce6542218fded1128:


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 23 69 66 20 64 65 66  enable){.#if def
0b30: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
0b40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0b50: 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
0b60: 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54 49  ined(TH3_COMPATI
0b70: 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e 61  BILITY).  /* Ena
0b80: 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72 65  ble global share
0b90: 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f 6e  d cache function
0ba0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61   for debugging a
0bb0: 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20 0a  nd unit tests, .
0bc0: 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f 72    ** but not for
0bd0: 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72 65   release */.  re
0be0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
0bf0: 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  SE;.#else.  sqli
0c00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0c10: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0c20: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c40: 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
0c50: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0c60: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0c70: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0c80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0c90: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
0ca0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
0cb0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0cc0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
0cd0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
0ce0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
0cf0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0d00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0d10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0d20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0d30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0d40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0d50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0d60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0d70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0d80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0d90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0da0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0db0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0dc0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0dd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0de0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0df0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0e00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0e10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0e20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0e30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0e40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0e50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0e60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0e70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0e80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0e90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ea0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0eb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0ec0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0ed0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0ee0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0ef0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0f00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0f10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0f20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0f30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0f40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0f50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0f70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0f80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0fa0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0fb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0fc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0fd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0fe0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0ff0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
1000: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
1010: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
1020: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
1030: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
1040: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
1050: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
1060: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
1070: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1080: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
1090: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
10a0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
10b0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
10c0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
10d0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
10e0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
10f0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
1100: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
1110: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
1120: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
1130: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
1140: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
1150: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
1160: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
1170: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
1180: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
1190: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
11a0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
11b0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
11c0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
11d0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
11e0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
11f0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
1200: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
1210: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
1220: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
1230: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
1240: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
1250: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
1260: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
1270: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
1280: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
1290: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
12a0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
12b0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
12c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
12d0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
12e0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
12f0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1300: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1310: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1320: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1330: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1340: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1360: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1370: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1380: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1390: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
13a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
13b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
13e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
13f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1400: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1410: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1420: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1430: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1440: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1450: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1460: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1470: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1480: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1490: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
14a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
14b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
14c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
14d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
14e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
14f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1500: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1510: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1520: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1530: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1540: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1550: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1560: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1570: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1580: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1590: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
15a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
15b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
15c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
15d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
15e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
15f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1610: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1620: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1630: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1640: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1650: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1660: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1670: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1680: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1690: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
16a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
16b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
16c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
16d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
16e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
16f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1700: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1710: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1720: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1730: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1740: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1750: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1760: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1770: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1780: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1790: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
17a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
17b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
17c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
17d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
17e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
17f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1800: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1810: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1820: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1830: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1840: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1850: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1860: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1870: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1880: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1890: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
18a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
18b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
18c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
18d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
18e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
18f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1900: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1910: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1920: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1940: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1950: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1960: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1970: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1980: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1990: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
19a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
19b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
19c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
19d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
19e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
19f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1a00: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1a10: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1a20: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1a30: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1a40: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1a50: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1a70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1a80: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1a90: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
1aa0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
1ab0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
1ac0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
1ad0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
1ae0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
1af0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1b00: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1b10: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1b30: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1b40: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1b50: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1b60: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1b70: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1b80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1b90: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
1ba0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
1bb0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
1bc0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1bd0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
1be0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1bf0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1c00: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1c10: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1c20: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1c30: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1c40: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1c50: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1c60: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1c70: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1c80: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1c90: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
1ca0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
1cb0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
1cc0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
1cd0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
1ce0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
1cf0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1d00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1d10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1d20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1d30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1d40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1d50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1d60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1d70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1d80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1d90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1da0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1db0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1dc0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1dd0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1de0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1df0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1e00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1e10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1e20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1e40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1e50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1e60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1e70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1e80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1e90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ea0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1eb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1ec0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1ed0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ee0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1ef0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1f00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1f10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1f20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1f30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1f40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1f50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1f60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1f70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1f80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1f90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1fa0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1fb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1fc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1fd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1fe0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1ff0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
2000: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
2010: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
2020: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
2030: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
2040: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
2050: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
2060: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
2070: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
2080: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
2090: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
20a0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
20b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20c0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
20d0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
20e0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
20f0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2100: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
2110: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2120: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2130: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
2140: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2150: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
2160: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
2170: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
2180: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
2190: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
21a0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
21b0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
21c0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
21d0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
21e0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
21f0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
2200: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
2210: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
2220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
2230: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
2240: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
2250: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
2260: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
2270: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
2280: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
2290: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
22a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
22b0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
22c0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
22d0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
22e0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
22f0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2300: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2310: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2320: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2330: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2340: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2350: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2360: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2370: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2380: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2390: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
23b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
23c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
23d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
23e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
23f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2400: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2410: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2420: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2430: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2440: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2450: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2460: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2470: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2480: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2490: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
24a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
24b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
24c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
24d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
24e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
24f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2500: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2510: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2520: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2530: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2540: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2550: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2560: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2570: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2580: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2590: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
25a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
25b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
25c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
25d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
25e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
25f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2600: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2610: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2620: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2630: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2640: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2650: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2660: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2670: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2680: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2690: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
26a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
26b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
26c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
26d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
26e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
26f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2700: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2710: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2720: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2730: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2740: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2750: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2760: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2770: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2780: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
27a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
27b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
27c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
27d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
27e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2800: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2810: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2820: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2830: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2840: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2860: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2870: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2880: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2890: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
28a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
28b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
28c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
28d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
28e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
28f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2900: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2910: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2920: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2930: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2940: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2950: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2960: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2970: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2980: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2990: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
29a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
29b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
29c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
29d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
29e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
29f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2a00: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2a10: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2a20: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2a30: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2a40: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2a50: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2a60: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2a70: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2a80: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2a90: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
2aa0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
2ab0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
2ac0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
2ad0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
2ae0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
2af0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2b00: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2b10: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2b20: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2b30: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2b40: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2b50: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2b60: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2b70: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2b80: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2b90: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
2ba0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2bb0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
2bc0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2bd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2be0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
2bf0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2c00: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2c10: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2c20: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2c30: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2c40: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2c50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2c60: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2c70: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2c80: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2c90: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
2ca0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
2cb0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2cc0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
2cd0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
2ce0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
2cf0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2d00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2d10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2d20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2d30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2d40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2d50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2d60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2d70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2d80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2d90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2da0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2db0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2dc0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2dd0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2de0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2df0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2e00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2e10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2e20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2e30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2e40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2e50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2e60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2e70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2e80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2e90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ea0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2eb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2ec0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2ed0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2ee0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2ef0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2f20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2f30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2f40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2f50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2f60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2f70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2f80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2f90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2fa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2fb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2fc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2fd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2fe0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2ff0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
3000: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
3010: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
3020: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3030: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3050: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3060: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3070: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3080: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
3090: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30a0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30b0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30c0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30d0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30e0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
30f0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3100: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3110: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3120: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3130: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3140: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3150: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3160: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3170: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3180: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
3190: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31a0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31b0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31c0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
31f0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3200: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3220: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3230: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3240: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3250: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3260: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3270: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3280: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
3290: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32a0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32c0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32d0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32e0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
32f0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3300: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3310: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3320: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3330: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3340: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3350: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3360: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3370: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3380: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3390: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
33f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3400: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3410: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3420: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3430: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3440: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3450: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3460: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3470: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3480: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3490: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
34f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3500: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3510: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3520: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3530: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3540: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3550: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3560: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3570: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3580: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
35f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3600: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3610: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3630: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3640: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3650: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3660: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3670: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3680: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3690: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
36f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3700: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3710: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3720: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3730: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3740: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3750: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3760: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3770: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3780: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3790: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
37f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3800: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3810: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3820: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3830: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3840: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3850: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3860: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3880: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3890: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
38f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3900: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3910: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3920: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3930: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3940: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3950: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3960: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3970: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3980: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3990: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
39f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a00: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a10: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a20: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a30: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a50: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a60: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a80: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3a90: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3aa0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3ab0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3ac0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3ad0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3ae0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3af0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b00: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b10: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b20: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b30: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b40: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b50: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3b60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b70: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3b80: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
3b90: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
3ba0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
3bb0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
3bc0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3bd0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
3be0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3bf0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3c00: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
3c10: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
3c20: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
3c30: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
3c40: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
3c50: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3c60: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3c70: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3c80: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3c90: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3ca0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3cb0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3cc0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3cd0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3ce0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3cf0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3d10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3d20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3d30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3d40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3d50: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3d60: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3d70: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
3d80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
3d90: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
3da0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3db0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
3dc0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
3dd0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
3de0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
3df0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
3e00: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
3e10: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
3e20: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
3e30: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
3e40: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
3e50: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
3e60: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
3e70: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
3e80: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
3e90: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
3ea0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
3eb0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3ec0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
3ed0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
3ee0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
3ef0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
3f00: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
3f10: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
3f20: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
3f30: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
3f40: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
3f50: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
3f60: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
3f70: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
3f80: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
3f90: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
3fa0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
3fb0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3fc0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
3fd0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
3fe0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3ff0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4000: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4010: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4020: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4030: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4040: 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20    i64 iRow,     
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4060: 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
4070: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4080: 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61  .  int isClearTa
4090: 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ble        /* Tr
40a0: 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  ue if all rows a
40b0: 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  re being deleted
40c0: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
40d0: 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
40e0: 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
40f0: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
4100: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
4110: 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
4120: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
4130: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4140: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4150: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4160: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4170: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
4180: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
4190: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
41a0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41b0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41d0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41e0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
41f0: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4200: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4210: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4220: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4230: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4240: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4250: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4260: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4270: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4280: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
4290: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42a0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42b0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42c0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42d0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
42f0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4300: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4310: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4320: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4330: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4340: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4350: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4360: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4370: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4380: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
4390: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43a0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43b0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43c0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43d0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43e0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
43f0: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4400: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4410: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4420: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4430: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4440: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4450: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4460: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4470: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4480: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
4490: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44a0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44b0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44c0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44e0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
44f0: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4500: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4510: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4520: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4530: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4540: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4550: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4560: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4570: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4580: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
4590: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45a0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45b0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45c0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45d0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45e0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
45f0: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4600: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4610: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4620: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4630: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4640: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4650: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4660: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4670: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4680: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
4690: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46a0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46b0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46c0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46d0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46e0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
46f0: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4700: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4710: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4720: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4730: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4740: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4750: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4760: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4770: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4780: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
4790: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47a0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47c0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47d0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47e0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
47f0: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4800: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4810: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4820: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4830: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4840: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4850: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4860: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4870: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4880: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
4890: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48a0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48b0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48c0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48d0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48e0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
48f0: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4900: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4910: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4920: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4930: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4940: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4950: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4960: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4970: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4980: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
4990: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49a0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49b0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49c0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49e0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
49f0: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a00: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a10: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a30: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a40: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a50: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a70: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a80: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4a90: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4aa0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ab0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ad0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4ae0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4af0: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b10: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b20: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b30: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b40: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b50: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b60: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b70: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b80: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4b90: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4ba0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bb0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bc0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bd0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4bf0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c00: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c10: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c20: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c30: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c40: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c50: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c60: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c70: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4c90: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4ca0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cb0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cc0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cd0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4ce0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4cf0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d00: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d10: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d20: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d30: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d40: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d50: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d60: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d70: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d80: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4d90: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4da0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4db0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dc0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4dd0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4de0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4df0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e00: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e20: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e30: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e40: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e50: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e60: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e70: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e80: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4e90: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ea0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4eb0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ec0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ed0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ee0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4ef0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f00: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f10: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f20: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f30: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f40: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f50: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f60: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f70: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f80: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4f90: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fa0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fb0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fc0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fd0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4fe0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
4ff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5000: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5010: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5020: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5030: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5040: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5050: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5060: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5070: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5080: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
5090: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50a0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50b0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50c0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50d0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50e0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
50f0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5100: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5110: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5120: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5130: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5140: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5150: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5160: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5170: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5180: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
5190: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51a0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51b0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51c0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51d0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51e0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
51f0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
5200: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
5210: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5220: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
5230: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
5240: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
5250: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5260: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
5270: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
5280: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
5290: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
52a0: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
52b0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
52c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
52d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
52e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
52f0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
5300: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
5310: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
5320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5330: 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
5340: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
5350: 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d  pCur);.    pCur-
5360: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5370: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
5380: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
5390: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
53a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
53b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
53c0: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
53d0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63  all cursors (exc
53e0: 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61  ept pExcept) tha
53f0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  t are open on.**
5400: 20 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68   the table  with
5410: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
5420: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
5430: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
5440: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
5450: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
5460: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
5470: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
5480: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
5490: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
54a0: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
54b0: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
54c0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
54d0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
54e0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
54f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5500: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
5520: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
5530: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
5540: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
5550: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
5560: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5570: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5580: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5590: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
55a0: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
55b0: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
55c0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
55d0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
55e0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
55f0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
5600: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5620: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5630: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5640: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5650: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5660: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5670: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5680: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5690: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
56a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
56b0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
56c0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
56d0: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
56e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
56f0: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5700: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
5710: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5720: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5730: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
5740: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
5750: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
5760: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5770: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5780: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5790: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
57a0: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
57b0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
57c0: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
57d0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
57e0: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
57f0: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5800: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
5810: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
5820: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5830: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
5840: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5850: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
5860: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5870: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5880: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5890: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
58a0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
58b0: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
58c0: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
58d0: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
58e0: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
58f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5900: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5910: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5920: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5930: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
5940: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
5950: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
5960: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5970: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5980: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5990: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
59a0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
59c0: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
59d0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
59e0: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
59f0: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5a00: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5a10: 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20  ace[200];       
5a20: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5a30: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
5a40: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
5a50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
5a60: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5a70: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5a80: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5a90: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5aa0: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5ab0: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5ac0: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5af0: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5b00: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
5b10: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
5b20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
5b40: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
5b50: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
5b60: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5b70: 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  xKey);.    if( p
5b80: 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d  IdxKey->nField==
5b90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5ba0: 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70  e3DbFree(pCur->p
5bb0: 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72  KeyInfo->db, pFr
5bc0: 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ee);.      retur
5bd0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5be0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
5bf0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
5c00: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
5c10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
5c20: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
5c30: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
5c40: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20  , bias, pRes);. 
5c50: 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
5c60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5c70: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
5c80: 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a  db, pFree);.  }.
5c90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5ca0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
5cb0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
5cc0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
5cd0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
5ce0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
5cf0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
5d00: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
5d10: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
5d20: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
5d30: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
5d40: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
5d50: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
5d60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
5d70: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
5d80: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
5d90: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
5da0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5db0: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
5dc0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
5dd0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
5de0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
5df0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5e00: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
5e10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
5e20: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5e30: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
5e40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
5e50: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
5e60: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
5e70: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
5e80: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
5e90: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
5ea0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
5eb0: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
5ec0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5ed0: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72  ALID;.  rc = btr
5ee0: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
5ef0: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
5f00: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
5f10: 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  >skipNext);.  if
5f20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5f30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5f40: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
5f50: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
5f60: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
5f70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5f80: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
5f90: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5fa0: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
5fb0: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
5fc0: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
5fd0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5fe0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
5ff0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6000: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6010: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6020: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6030: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6040: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6050: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6060: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6070: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6080: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6090: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
60a0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
60b0: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
60c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
60d0: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
60e0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
60f0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
6100: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
6110: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6120: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6130: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
6140: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6150: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
6160: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
6170: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
6180: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
6190: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
61a0: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
61b0: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
61c0: 20 69 73 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f   is set as follo
61d0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20  ws:.**.**    0: 
61e0: 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
61f0: 75 6e 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 20  unchanged.**    
6200: 31 3a 20 20 20 54 68 65 20 63 75 72 73 6f 72 20  1:   The cursor 
6210: 69 73 20 73 74 69 6c 6c 20 70 6f 69 6e 74 69 6e  is still pointin
6220: 67 20 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f  g at the same ro
6230: 77 2c 20 62 75 74 20 74 68 65 20 70 6f 69 6e 74  w, but the point
6240: 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ers.**         r
6250: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
6260: 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
6270: 29 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  ) or sqlite3Btre
6280: 65 44 61 74 61 46 65 74 63 68 28 29 0a 2a 2a 20  eDataFetch().** 
6290: 20 20 20 20 20 20 20 20 6d 69 67 68 74 20 6e 6f          might no
62a0: 77 20 62 65 20 69 6e 76 61 6c 69 64 20 62 65 63  w be invalid bec
62b0: 61 75 73 65 20 6f 66 20 61 20 62 61 6c 61 6e 63  ause of a balanc
62c0: 65 28 29 20 6f 72 20 6f 74 68 65 72 20 63 68 61  e() or other cha
62d0: 6e 67 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  nge to the.**   
62e0: 20 20 20 20 20 20 62 2d 74 72 65 65 2e 0a 2a 2a        b-tree..**
62f0: 20 20 20 20 32 3a 20 20 20 54 68 65 20 63 75 72      2:   The cur
6300: 73 6f 72 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  sor is no longer
6310: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
6320: 20 72 6f 77 2e 20 20 54 68 65 20 72 6f 77 20 6d   row.  The row m
6330: 69 67 68 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  ight have.**    
6340: 20 20 20 20 20 62 65 65 6e 20 64 65 6c 65 74 65       been delete
6350: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
6360: 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
6370: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6380: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
6390: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
63a0: 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a  nt *pHasMoved){.
63b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
63c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
63d0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
63e0: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
63f0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
6400: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
6410: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6420: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6430: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6440: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b   *pHasMoved = 2;
6450: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6460: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
6470: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6480: 41 4c 49 44 20 7c 7c 20 4e 45 56 45 52 28 70 43  ALID || NEVER(pC
6490: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 29  ur->skipNext!=0)
64a0: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
64b0: 65 64 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 2;.  }else{
64c0: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
64d0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
64e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
64f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6500: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
6510: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67  *.** Given a pag
6520: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65  e number of a re
6530: 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70  gular database p
6540: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
6550: 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
6560: 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  or the pointer-m
6570: 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  ap page that con
6580: 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20  tains the entry 
6590: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74  for the.** input
65a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
65b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f  .** Return 0 (no
65c0: 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20  t a valid page) 
65d0: 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63  for pgno==1 sinc
65e0: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  e there is.** no
65f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73   pointer map ass
6600: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
6610: 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72  e 1.  The integr
6620: 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a  ity_check logic.
6630: 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ** requires that
6640: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c   ptrmapPageno(*,
6650: 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  1)!=1..*/.static
6660: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
6670: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
6680: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
6690: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
66a0: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
66b0: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
66c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
66d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
66e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
66f0: 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o<2 ) return 0;.
6700: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
6710: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
6720: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
6730: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
6740: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
6750: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
6760: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
6770: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
6780: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
6790: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
67a0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
67b0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
67c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
67d0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
67e0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
67f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
6800: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
6810: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6820: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
6830: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
6840: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
6850: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
6860: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
6870: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
6880: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
6890: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
68a0: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
68b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
68c0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
68d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
68e0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
68f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
6900: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
6910: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
6920: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
6930: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6940: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
6950: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
6960: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
6970: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
6980: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6990: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
69a0: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
69b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
69c0: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
69d0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
69e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
69f0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
6a00: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
6a10: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
6a20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6a30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6a40: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6a50: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
6a60: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
6a70: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
6a80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6a90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6aa0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
6ab0: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6ac0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
6ad0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
6ae0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
6af0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
6b00: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
6b10: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
6b20: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6b30: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
6b40: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
6b50: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
6b60: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6b70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6b80: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
6b90: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
6ba0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
6bb0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
6bc0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
6bd0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
6be0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
6bf0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6c00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
6c10: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
6c20: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
6c30: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6c40: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6c50: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
6c60: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
6c90: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
6ca0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
6cb0: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
6cc0: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50  leSize-5 );.  pP
6cd0: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
6ce0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
6cf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
6d00: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
6d10: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
6d20: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d30: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
6d40: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
6d50: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
6d60: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
6d70: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
6d80: 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20  nt));.    *pRC= 
6d90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6da0: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
6db0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6dc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6dd0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
6de0: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
6df0: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
6e00: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
6e10: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
6e20: 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73  ptrmap_exit:.  s
6e30: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6e40: 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  (pDbPage);.}../*
6e50: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
6e60: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
6e70: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
6e90: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
6ea0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6eb0: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
6ec0: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
6ed0: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6ee0: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
6ef0: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
6f00: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
6f10: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6f20: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
6f30: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
6f40: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
6f50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6f60: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
6f70: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6f80: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
6f90: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
6fa0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6fb0: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
6fc0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6fd0: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
6fe0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6ff0: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
7000: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7010: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7020: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
7030: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
7040: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
7050: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
7060: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
7070: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
7080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
70a0: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
70b0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
70c0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
70d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
70e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
70f0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
7100: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
7110: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7120: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
7130: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
7140: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
7150: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
7160: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
7170: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
7180: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
7190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
71a0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
71b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
71c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
71d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
71e0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
71f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
7200: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
7210: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
7220: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
7230: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
7240: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
7250: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
7260: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
7270: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
7280: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
7290: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
72a0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
72b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
72c0: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
72d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
72e0: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
72f0: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
7300: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
7310: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
7320: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
7330: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
7340: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
7350: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
7360: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
7370: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
7380: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
7390: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
73a0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
73b0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
73c0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
73d0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
73e0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
73f0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
7400: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
7410: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7420: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7430: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
7440: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
7450: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
7460: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
7470: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
7480: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
7490: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
74a0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
74b0: 74 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  te(&(P)->aCellId
74c0: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
74d0: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44  ine findCellv2(D
74e0: 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65  ,M,O,I) (D+(M&ge
74f0: 74 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49  t2byte(D+(O+2*(I
7500: 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  ))))).../*.** Th
7510: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
7520: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
7530: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
7540: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
7550: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
7560: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
7570: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
7580: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
7590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
75a0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
75b0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
75c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
75d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
75e0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
75f0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
7600: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
7610: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20     int k;.    k 
7620: 3d 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  = pPage->aiOvfl[
7630: 69 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69  i];.    if( k<=i
7640: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
7650: 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k==iCell ){.  
7660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61        return pPa
7670: 67 65 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20  ge->apOvfl[i];. 
7680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65       }.      iCe
7690: 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll--;.    }.  }.
76a0: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
76b0: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
76c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
76d0: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
76e0: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
76f0: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
7700: 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a  ructure.  There.
7710: 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  ** are two versi
7720: 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ons of this func
7730: 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73  tion.  btreePars
7740: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
7750: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
7760: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7770: 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50  ument and btreeP
7780: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a  arseCellPtr() .*
7790: 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  * takes a pointe
77a0: 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  r to the body of
77b0: 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73   the cell as its
77c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
77d0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ..**.** Within t
77e0: 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61  his file, the pa
77f0: 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20  rseCell() macro 
7800: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  can be called in
7810: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65  stead of.** btre
7820: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e  eParseCellPtr().
7830: 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70   Using some comp
7840: 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c  ilers, this will
7850: 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73   be faster..*/.s
7860: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
7870: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
7880: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
78a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
78b0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
78c0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
78d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
78e0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
78f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
7900: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
7910: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
7920: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36  ture */.){.  u16
7930: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
7940: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62       /* Number b
7950: 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e  ytes in cell con
7960: 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20  tent header */. 
7970: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
7980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7990: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
79a0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  ell payload */..
79b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
79c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
79d0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
79e0: 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65  );..  pInfo->pCe
79f0: 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73  ll = pCell;.  as
7a00: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7a10: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
7a20: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20  eaf==1 );.  n = 
7a30: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
7a40: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
7a50: 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  ==4-4*pPage->lea
7a60: 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  f );.  if( pPage
7a70: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
7a80: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
7a90: 74 61 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ta ){.      asse
7aa0: 72 74 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( n==0 );.    
7ab0: 20 20 6e 20 3d 20 67 65 74 56 61 72 69 6e 74 33    n = getVarint3
7ac0: 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61  2(pCell, nPayloa
7ad0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
7ae0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
7af0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
7b00: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
7b10: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
7b20: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
7b30: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
7b40: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
7b50: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
7b60: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
7b70: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
7b80: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
7b90: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
7ba0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
7bb0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
7bc0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
7bd0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
7be0: 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73  r = n;.  testcas
7bf0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
7c00: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7c10: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
7c20: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
7c30: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7c40: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
7c50: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
7c60: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
7c70: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
7c80: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
7c90: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
7ca0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
7cb0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
7cc0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
7cd0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
7ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
7cf0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
7d00: 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c  6)(n+nPayload))<
7d10: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
7d20: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
7d30: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
7d40: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
7d50: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7d60: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7d70: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
7d80: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
7d90: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
7da0: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
7db0: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
7dc0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
7dd0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
7de0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
7df0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
7e00: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
7e10: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
7e20: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
7e30: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
7e40: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
7e50: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
7e60: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
7e70: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
7e80: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
7e90: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
7ea0: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
7eb0: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
7ec0: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
7ed0: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
7ee0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7ef0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
7f00: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
7f10: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
7f20: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
7f30: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
7f40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
7f50: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
7f60: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7f70: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7f80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
7f90: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
7fa0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7fb0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7fc0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
7fd0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
7fe0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
7ff0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8000: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
8010: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
8020: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
8030: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
8040: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
8050: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
8060: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
8070: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8080: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8090: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
80a0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
80b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
80c0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
80d0: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
80e0: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
80f0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
8100: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
8110: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
8120: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
8130: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8140: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
8150: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
8160: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
8170: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
8180: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
8190: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
81a0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
81b0: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
81c0: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
81d0: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
81e0: 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  \.  btreeParseCe
81f0: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
8200: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
8210: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
8220: 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  o)).static void 
8230: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
8240: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8250: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8260: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8270: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
8280: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8290: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
82a0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
82b0: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
82c0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
82d0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
82e0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
82f0: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
8300: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
8310: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
8320: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
8330: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8340: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
8350: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
8360: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
8370: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
8380: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
8390: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
83a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
83b0: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
83c0: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
83d0: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
83e0: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
83f0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
8400: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
8410: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
8420: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
8430: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8440: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
8450: 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e  = &pCell[pPage->
8460: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
8470: 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66   u32 nSize;..#if
8480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8490: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
84a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
84b0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
84c0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
84d0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
84e0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
84f0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8500: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8510: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8520: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8530: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8540: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8550: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8560: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8570: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8580: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8590: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
85a0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
85b0: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
85c0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
85d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
85e0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
85f0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
8600: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
8610: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
8620: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
8630: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8640: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8650: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
8660: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
8670: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
8680: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8690: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
86a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
86b0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
86c0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
86d0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
86e0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
86f0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8700: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8710: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8720: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8730: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8740: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8750: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8760: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8770: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8780: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
8790: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
87a0: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
87b0: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
87c0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
87d0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
87e0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
87f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
8800: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
8810: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
8820: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
8830: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8840: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
8850: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
8860: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
8870: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8880: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8890: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
88a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
88b0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
88c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
88d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
88e0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
88f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
8900: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
8910: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
8920: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
8930: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
8940: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
8950: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
8960: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
8970: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
8980: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
8990: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
89a0: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
89b0: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
89c0: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
89d0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
89e0: 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ze;.}..#ifdef SQ
89f0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
8a00: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
8a10: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
8a20: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
8a30: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
8a40: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
8a50: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a60: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
8a70: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
8a80: 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a    return cellSiz
8a90: 65 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64  ePtr(pPage, find
8aa0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
8ab0: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
8ac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8ad0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
8ae0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
8af0: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
8b00: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
8b10: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
8b20: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
8b30: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
8b40: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
8b50: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
8b60: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
8b70: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
8b80: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
8b90: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
8ba0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
8bb0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
8bc0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
8bd0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
8be0: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
8bf0: 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  =0 );.  btreePar
8c00: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8c10: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
8c20: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
8c30: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
8c40: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
8c50: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
8c60: 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  d );.  if( info.
8c70: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
8c80: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
8c90: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
8ca0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
8cb0: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
8cc0: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
8cd0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
8ce0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
8cf0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
8d00: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
8d10: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
8d20: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
8d30: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
8d40: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
8d50: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
8d60: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
8d70: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
8d80: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
8d90: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
8da0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
8db0: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
8dc0: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
8dd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
8de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8df0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
8e00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
8e10: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e30: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8e40: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e60: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
8e70: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
8e80: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
8e90: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8ea0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
8eb0: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
8ec0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8ed0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
8ee0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
8ef0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
8f00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8f10: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
8f20: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
8f30: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
8f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8f50: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8f60: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
8f70: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f90: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8fa0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
8fb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
8fe0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
8ff0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9000: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
9010: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
9020: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9030: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
9040: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
9050: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
9060: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
9070: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
9080: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
9090: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
90a0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
90c0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
90d0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20  ll index */...  
90e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
90f0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9100: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9110: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9120: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
9130: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9140: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
9150: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
9160: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
9170: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
9180: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
9190: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
91a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
91b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
91c0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
91d0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
91e0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
91f0: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
9200: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
9210: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9220: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
9230: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9240: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
9250: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
9260: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
9270: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9280: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
9290: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
92a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
92b0: 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65   cbrk = get2byte
92c0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
92d0: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63    memcpy(&temp[c
92e0: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b  brk], &data[cbrk
92f0: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
9300: 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20  cbrk);.  cbrk = 
9310: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43  usableSize;.  iC
9320: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
9330: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
9340: 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
9350: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
9360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
9370: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
9380: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
9390: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
93a0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
93b0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
93c0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
93d0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
93e0: 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63  Addr);.    testc
93f0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
9400: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9410: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
9420: 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e  st );.#if !defin
9430: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9440: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
9450: 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65  HECK).    /* The
9460: 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61  se conditions ha
9470: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
9480: 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65  verified in btre
9490: 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20  eInitPage().    
94a0: 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ** if SQLITE_ENA
94b0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
94c0: 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e  L_CHECK is defin
94d0: 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed .    */.    i
94e0: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
94f0: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
9500: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9510: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9520: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  BKPT;.    }.#end
9530: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
9540: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
9550: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
9560: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
9570: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
9580: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
9590: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69  cbrk -= size;.#i
95a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
95b0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
95c0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
95d0: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
95e0: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  irst ){.      re
95f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9610: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62  #else.    if( cb
9620: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
9630: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
9640: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
9650: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9660: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9670: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9680: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
9690: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
96a0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
96b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
96c0: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
96d0: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
96e0: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
96f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d  bleSize );.    m
9700: 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b  emcpy(&data[cbrk
9710: 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69  ], &temp[pc], si
9720: 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ze);.    put2byt
9730: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
9740: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
9750: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
9760: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
9770: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
9780: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
9790: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
97a0: 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  2] = 0;.  data[h
97b0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+7] = 0;.  mem
97c0: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
97d0: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
97e0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
97f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9800: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9810: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9820: 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c  .  if( cbrk-iCel
9830: 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e  lFirst!=pPage->n
9840: 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Free ){.    retu
9850: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9860: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
9870: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9880: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
9890: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
98a0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68   space from with
98b0: 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61  in the B-Tree pa
98c0: 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  ge passed.** as 
98d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
98e0: 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  nt. Write into *
98f0: 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69  pIdx the index i
9900: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
9910: 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  [].** of the fir
9920: 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63  st byte of alloc
9930: 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75  ated space. Retu
9940: 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  rn either SQLITE
9950: 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72  _OK or.** an err
9960: 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79  or code (usually
9970: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
9980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
9990: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
99a0: 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66  at there is suff
99b0: 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20  icient space to 
99c0: 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  make the.** allo
99d0: 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f  cation.  This ro
99e0: 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64  utine might need
99f0: 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69   to defragment i
9a00: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67  n order to bring
9a10: 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63  .** all the spac
9a20: 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65  e together, howe
9a30: 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ver.  This routi
9a40: 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73  ne will avoid us
9a50: 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ing.** the first
9a60: 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20   two bytes past 
9a70: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9a80: 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73   area since pres
9a90: 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61  umably this.** a
9aa0: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69  llocation is bei
9ab0: 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72  ng made in order
9ac0: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
9ad0: 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c   cell, so we wil
9ae0: 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70  l.** also end up
9af0: 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63   needing a new c
9b00: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
9b10: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
9b20: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
9b30: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
9b40: 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a  te, int *pIdx){.
9b50: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
9b60: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
9b70: 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  et;    /* Local 
9b80: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9b90: 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75  hdrOffset */.  u
9ba0: 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
9bb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
9bc0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
9bd0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  he of pPage->aDa
9be0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  ta */.  int nFra
9bf0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c10: 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  Number of fragme
9c20: 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50  nted bytes on pP
9c30: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
9c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c60: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
9c70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9c80: 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20   */.  int gap;  
9c90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9ca0: 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65  yte of gap betwe
9cb0: 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  en cell pointers
9cc0: 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   and cell conten
9cd0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
9ce0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
9cf0: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
9d00: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
9d10: 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
9d20: 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  e of the page */
9d30: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
9d40: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9d50: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9d60: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9d70: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
9d80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9d90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9da0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9db0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
9dc0: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
9dd0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
9de0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
9df0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
9e00: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
9e10: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
9e20: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62  low==0 );.  usab
9e30: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
9e40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
9e50: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9e60: 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d 38 20   < usableSize-8 
9e70: 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  );..  nFrag = da
9e80: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73  ta[hdr+7];.  ass
9e90: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
9ea0: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
9eb0: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
9ec0: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
9ed0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
9ee0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
9ef0: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
9f00: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
9f10: 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67  hdr+5]);.  if( g
9f20: 61 70 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20  ap>top ) return 
9f30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f40: 4b 50 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28  KPT;.  testcase(
9f50: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
9f60: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
9f70: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
9f80: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
9f90: 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36  ..  if( nFrag>=6
9fa0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  0 ){.    /* Alwa
9fb0: 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69  ys defragment hi
9fc0: 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20  ghly fragmented 
9fd0: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20  pages */.    rc 
9fe0: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
9ff0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
a000: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a010: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a020: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
a030: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73  [hdr+5]);.  }els
a040: 65 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70  e if( gap+2<=top
a050: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63   ){.    /* Searc
a060: 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c  h the freelist l
a070: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
a080: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
a090: 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20  h to satisfy .  
a0a0: 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
a0b0: 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  . The allocation
a0c0: 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68   is made from th
a0d0: 65 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f  e first free slo
a0e0: 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  t in .    ** the
a0f0: 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61   list that is la
a100: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63  rge enough to ac
a110: 63 6f 6d 6d 6f 64 61 74 65 20 69 74 2e 0a 20 20  commodate it..  
a120: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c    */.    int pc,
a130: 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61   addr;.    for(a
a140: 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d  ddr=hdr+1; (pc =
a150: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a160: 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d  addr]))>0; addr=
a170: 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  pc){.      int s
a180: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
a190: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
a1a0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
a1b0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
a1c0: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72  ize-4 || pc<addr
a1d0: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  +4 ){.        re
a1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a1f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a200: 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  }.      size = g
a210: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
a220: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
a230: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
a240: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73         int x = s
a250: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
a260: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a270: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==4 );.        t
a280: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
a290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34  .        if( x<4
a2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
a2b0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
a2c0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
a2d0: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
a2e0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
a2f0: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
a300: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
a310: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
a320: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
a330: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
a340: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
a350: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
a360: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
a370: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
a380: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
a390: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
a3a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a3b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a3c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a3d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
a3e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
a3f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
a400: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
a410: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
a420: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
a430: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
a440: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
a450: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
a460: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a470: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
a480: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
a490: 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20  Idx = pc + x;.  
a4a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a4b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
a4c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a4d0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
a4e0: 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  re there is enou
a4f0: 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65 20  gh space in the 
a500: 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20  gap to satisfy. 
a510: 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   ** the allocati
a520: 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66  on.  If not, def
a530: 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  ragment..  */.  
a540: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
a550: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
a560: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
a570: 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  top ){.    rc = 
a580: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
a590: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
a5a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
a5b0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
a5c0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
a5d0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
a5e0: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
a5f0: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
a600: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
a610: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
a620: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
a630: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
a640: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
a650: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
a660: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
a670: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
a680: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
a690: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
a6a0: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
a6b0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
a6c0: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
a6d0: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
a6e0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
a6f0: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
a700: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
a710: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
a720: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
a730: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
a740: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
a750: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
a760: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a770: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
a780: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
a790: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
a7a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a7b0: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
a7c0: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
a7d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
a7e0: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
a7f0: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
a800: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
a810: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
a820: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
a830: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
a840: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
a850: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
a860: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
a870: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
a880: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
a890: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
a8a0: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
a8b0: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
a8c0: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
a8d0: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
a8e0: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
a8f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a900: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
a910: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
a920: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
a930: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
a940: 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c  n, hdr;.  int iL
a950: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
a960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a970: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
a980: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
a990: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
a9a0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
a9b0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
a9c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
a9d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a9e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
a9f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aa00: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
aa10: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
aa20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
aa30: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
aa40: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
aa50: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 20 3c  (start + size) <
aa60: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
aa70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
aa80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
aa90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
aaa0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
aab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
aac0: 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=0 );   /* Mi
aad0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
aae0: 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28 20 70  is 4 */..  if( p
aaf0: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
ab00: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
ab10: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
ab20: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
ab30: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ab40: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
ab50: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ab60: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
ab70: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ab80: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73    memset(&data[s
ab90: 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b  tart], 0, size);
aba0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
abb0: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
abc0: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
abd0: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
abe0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
abf0: 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * even though th
ac00: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
ac10: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
ac20: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
ac30: 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  .  ** btreeInitP
ac40: 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65  age() did not de
ac50: 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67  tect overlapping
ac60: 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66   cells or.  ** f
ac70: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f  reeblocks that o
ac80: 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e  verlapped cells.
ac90: 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64     Nor does it d
aca0: 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20  etect when the. 
acb0: 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   ** cell content
acc0: 20 61 72 65 61 20 65 78 63 65 65 64 73 20 74 68   area exceeds th
acd0: 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70  e value in the p
ace0: 61 67 65 20 68 65 61 64 65 72 2e 20 20 49 66 20  age header.  If 
acf0: 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61  these.  ** situa
ad00: 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65  tions arise, the
ad10: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73  n subsequent ins
ad20: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d  ert operations m
ad30: 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a  ight corrupt.  *
ad40: 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  * the freelist. 
ad50: 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74   So we do need t
ad60: 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72  o check for corr
ad70: 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61  uption while sca
ad80: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  nning.  ** the f
ad90: 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
ada0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
adb0: 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d  Offset;.  addr =
adc0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73   hdr + 1;.  iLas
add0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  t = pPage->pBt->
ade0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
adf0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3c    assert( start<
ae00: 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c  =iLast );.  whil
ae10: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
ae20: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
ae30: 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62 65  ]))<start && pbe
ae40: 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  gin>0 ){.    if(
ae50: 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29   pbegin<addr+4 )
ae60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ae70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ae80: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  PT;.    }.    ad
ae90: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d  dr = pbegin;.  }
aea0: 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c  .  if( pbegin>iL
aeb0: 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ast ){.    retur
aec0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aed0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
aee0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
aef0: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
af00: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
af10: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
af20: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
af30: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
af40: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
af50: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
af60: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
af70: 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72  ree = pPage->nFr
af80: 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a  ee + (u16)size;.
af90: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
afa0: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
afb0: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
afc0: 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  hdr + 1;.  while
afd0: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
afe0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
aff0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
b000: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
b010: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
b020: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
b030: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 20 3c  assert( pbegin <
b040: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
b050: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
b060: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
b070: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
b080: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
b090: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
b0a0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
b0b0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
b0c0: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
b0d0: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
b0e0: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
b0f0: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
b100: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
b110: 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20  if( (frag<0) || 
b120: 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b  (frag>(int)data[
b130: 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20  hdr+7]) ){.     
b140: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b150: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74       }.      dat
b170: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29  a[hdr+7] -= (u8)
b180: 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20  frag;.      x = 
b190: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b1a0: 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75  next]);.      pu
b1b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
b1c0: 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  gin], x);.      
b1d0: 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32  x = pnext + get2
b1e0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
b1f0: 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20  +2]) - pbegin;. 
b200: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
b210: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78  ata[pbegin+2], x
b220: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
b230: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
b240: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
b250: 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  /* If the cell c
b260: 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69  ontent area begi
b270: 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c  ns with a freebl
b280: 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20  ock, remove it. 
b290: 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64  */.  if( data[hd
b2a0: 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35  r+1]==data[hdr+5
b2b0: 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d  ] && data[hdr+2]
b2c0: 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b  ==data[hdr+6] ){
b2d0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  .    int top;.  
b2e0: 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62    pbegin = get2b
b2f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
b300: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
b310: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74  ata[hdr+1], &dat
b320: 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20  a[pbegin], 2);. 
b330: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b340: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
b350: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b360: 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20  [pbegin+2]);.   
b370: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b380: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b390: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
b3a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b3b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b3c0: 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
b3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b3e0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
b3f0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
b400: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b410: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
b420: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
b430: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
b440: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
b450: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
b460: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
b470: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
b480: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
b490: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
b4a0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
b4b0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
b4c0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
b4d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
b4e0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
b4f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b500: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
b510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b520: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b530: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
b540: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
b550: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
b560: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
b570: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
b580: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b590: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
b5a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
b5b0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
b5c0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
b5d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b5e0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
b5f0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
b600: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
b610: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b620: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b630: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
b640: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
b650: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
b660: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
b670: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
b680: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
b690: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
b6a0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
b6b0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b6c0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
b6d0: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
b6e0: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
b6f0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
b700: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
b710: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
b720: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50  ge->hasData = pP
b730: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
b740: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b750: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
b760: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
b770: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
b780: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
b790: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
b7a0: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
b7b0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
b7c0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
b7d0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
b7e0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
b7f0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
b800: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
b810: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
b820: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
b830: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b840: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
b850: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
b860: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
b870: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
b880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b890: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b8a0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b8b0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b8c0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b8d0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b8e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b8f0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b900: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b910: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b920: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b930: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b940: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b950: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b960: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b970: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b980: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b990: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b9a0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b9b0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b9c0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b9d0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b9e0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
ba00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
ba10: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
ba20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ba30: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
ba40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ba50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ba60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
ba70: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
ba80: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
ba90: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
baa0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
bac0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
bad0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
bae0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
baf0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
bb00: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
bb10: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
bb20: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
bb30: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
bb40: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
bb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
bb60: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
bb70: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
bb80: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
bb90: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
bba0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
bbb0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
bbc0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
bbd0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
bbe0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
bbf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
bc00: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
bc10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
bc20: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
bc30: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
bc40: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
bc50: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
bc60: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
bc70: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
bc80: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
bc90: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
bca0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
bcb0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
bcc0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
bcd0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
bce0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
bcf0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
bd00: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
bd10: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
bd20: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
bd30: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
bd40: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
bd50: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
bd60: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bd70: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
bd80: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
bd90: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bda0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bdb0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
bdc0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
bdd0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
bde0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
bdf0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
be00: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
be10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
be20: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
be30: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
be40: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
be50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be60: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
be70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
be80: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
be90: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
bea0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
beb0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
bec0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
bed0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
bee0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
bef0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
bf00: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
bf10: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
bf20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
bf30: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
bf40: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
bf50: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
bf60: 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
bf70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  .    pPage->aCel
bf80: 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
bf90: 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f  lOffset];.    to
bfa0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
bfb0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
bfc0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
bfd0: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
bfe0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
bff0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
c000: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
c010: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
c020: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
c030: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
c040: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
c050: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
c060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c070: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c080: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
c090: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
c0a0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20  _CELL(pBt) );.. 
c0b0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
c0c0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
c0d0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
c0e0: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
c0f0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
c100: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
c110: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
c120: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
c130: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
c140: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
c150: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
c160: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
c170: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
c180: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
c190: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
c1a0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
c1b0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
c1c0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
c1d0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
c1e0: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
c1f0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
c200: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
c210: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c220: 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  4;.#if defined(S
c230: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
c240: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
c250: 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e  ).    {.      in
c260: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c270: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
c280: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c290: 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
c2a0: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
c2b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
c2c0: 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
c2d0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c2e0: 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
c2f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
c300: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
c310: 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
c320: 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
c330: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
c340: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c350: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c360: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
c370: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
c380: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
c390: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c3a0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
c3c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c3d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
c3e0: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
c3f0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
c400: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
c410: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
c420: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
c430: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
c440: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
c450: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
c460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c470: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c490: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
c4a0: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
c4b0: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64  ++;.    }  .#end
c4c0: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  if..    /* Compu
c4d0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
c4e0: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
c4f0: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
c500: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
c510: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
c520: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
c530: 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65  + top;.    while
c540: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
c550: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
c560: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c570: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c580: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c590: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66     /* Start of f
c5a0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
c5b0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c5c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c5d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c5e0: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
c5f0: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
c600: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
c610: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
c620: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
c630: 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
c640: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
c650: 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
c660: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c670: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
c680: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
c690: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
c6a0: 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
c6b0: 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  yte of.        *
c6c0: 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  * the free-block
c6d0: 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65   must lie on the
c6e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
c6f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
c700: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c710: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
c720: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
c730: 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
c740: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
c750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
c760: 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
c770: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
c780: 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
c790: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
c7a0: 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
c7b0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
c7c0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c7d0: 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
c7e0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
c7f0: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
c800: 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
c810: 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
c820: 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
c830: 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
c840: 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
c850: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
c860: 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
c870: 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
c880: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
c890: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c8a0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
c8b0: 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
c8c0: 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
c8d0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
c8e0: 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
c8f0: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
c900: 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
c910: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c930: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
c940: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
c950: 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
c960: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
c970: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
c980: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
c990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
c9b0: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
c9c0: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
c9d0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c9e0: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
c9f0: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
ca00: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
ca10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
ca20: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
ca30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
ca40: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ca50: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
ca60: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
ca70: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
ca80: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
ca90: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
caa0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
cab0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
cac0: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
cad0: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
cae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
caf0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
cb00: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
cb10: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
cb20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
cb30: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
cb40: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
cb50: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
cb60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
cb70: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
cb80: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
cb90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cba0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
cbb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
cbc0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
cbd0: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
cbe0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
cbf0: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
cc00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
cc10: 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
cc20: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
cc30: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
cc40: 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
cc50: 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
cc60: 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
cc70: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
cc80: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
cc90: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
cca0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
ccb0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
ccc0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
ccd0: 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
cce0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
ccf0: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
cd00: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
cd10: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
cd20: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
cd30: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
cd40: 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
cd50: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
cd60: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
cd70: 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
cd80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
cd90: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
cda0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
cdb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
cdc0: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
cdd0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
cde0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
cdf0: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
ce00: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
ce10: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
ce20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
ce30: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
ce40: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
ce50: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
ce60: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
ce70: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
ce80: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
ce90: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
cea0: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
ceb0: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
cec0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
ced0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
cee0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
cef0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cf00: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
cf10: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
cf20: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
cf30: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cf40: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
cf50: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
cf60: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
cf70: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
cf80: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
cf90: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
cfa0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
cfb0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
cfc0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
cfd0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
cfe0: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
cff0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
d000: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
d010: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
d020: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
d030: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
d040: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
d050: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
d060: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
d070: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
d080: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
d090: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
d0a0: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
d0b0: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
d0c0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
d0d0: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
d0e0: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
d0f0: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
d100: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
d110: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
d120: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
d130: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
d140: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
d150: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
d160: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
d170: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
d180: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
d190: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
d1a0: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
d1b0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
d1c0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
d1d0: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
d1e0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
d1f0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
d200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
d210: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
d220: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
d230: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
d240: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
d250: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
d260: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
d270: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
d280: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
d290: 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
d2a0: 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
d2b0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
d2c0: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
d2d0: 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
d2e0: 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
d2f0: 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
d300: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
d310: 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
d320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d330: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d340: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
d350: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
d360: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
d370: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
d380: 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
d390: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
d3a0: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
d3b0: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
d3c0: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
d3d0: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
d3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
d400: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
d410: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
d420: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
d430: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
d440: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
d450: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
d460: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
d470: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
d480: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
d490: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
d4a0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
d4b0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
d4c0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
d4d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
d4e0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
d4f0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
d500: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d510: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d520: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
d530: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
d540: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
d550: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
d560: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
d570: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
d580: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
d590: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
d5a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d5b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d5c0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d5d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
d5e0: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
d5f0: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
d600: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
d610: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
d620: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
d630: 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
d640: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
d650: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
d660: 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
d670: 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
d680: 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
d690: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
d6a0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
d6b0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
d6c0: 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
d6d0: 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
d6e0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62  .  return (int)b
d6f0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
d700: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
d710: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
d720: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
d730: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
d740: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
d750: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
d760: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
d770: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
d780: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
d790: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
d7a0: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
d7b0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d7c0: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
d7d0: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
d7e0: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
d7f0: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
d800: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
d810: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
d820: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
d830: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
d840: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d850: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d860: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d870: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d880: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
d890: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d8c0: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
d8d0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
d8e0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
d8f0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
d900: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
d910: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
d920: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
d930: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
d940: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
d950: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
d960: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
d970: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d980: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d990: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
d9a0: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
d9b0: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
d9c0: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
d9d0: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
d9e0: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
d9f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
da00: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
da10: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
da20: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
da30: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
da40: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
da50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
da60: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
da70: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
da80: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
da90: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
daa0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
dab0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
dac0: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
dad0: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
dae0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
daf0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
db00: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
db10: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
db20: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
db30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
db40: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
db50: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
db60: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
db70: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
db80: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
db90: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
dba0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
dbb0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
dbc0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
dbd0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
dbe0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
dbf0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
dc00: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
dc10: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
dc20: 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
dc30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
dc40: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
dc50: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
dc60: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
dc70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dc80: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
dc90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
dca0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
dcb0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
dcc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
dcd0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
dce0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
dcf0: 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
dd00: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
dd10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
dd20: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
dd30: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
dd40: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
dd50: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
dd60: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
dd70: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
dd80: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
dd90: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
dda0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
ddb0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
ddc0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
ddd0: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
dde0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
ddf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
de00: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
de10: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
de20: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
de30: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
de40: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
de50: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
de60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
de70: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
de80: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
de90: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
dea0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
deb0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
dec0: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
ded0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dee0: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
def0: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
df00: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
df10: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
df20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
df30: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
df40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
df50: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
df60: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
df70: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
df80: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
df90: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
dfa0: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
dfb0: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
dfc0: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
dfd0: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
dfe0: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
dff0: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
e000: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
e010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
e020: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
e030: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
e040: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
e050: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e060: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
e070: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
e080: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
e090: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
e0a0: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
e0b0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
e0c0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
e0d0: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
e0e0: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
e0f0: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
e100: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
e110: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
e120: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
e130: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
e140: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
e150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
e160: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
e170: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
e180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
e190: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
e1a0: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
e1b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e1c0: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
e1d0: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
e1e0: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
e1f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e200: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
e210: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
e220: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
e230: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
e240: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
e250: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
e260: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
e270: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
e280: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
e290: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e2a0: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
e2b0: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
e2c0: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
e2d0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
e2e0: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
e2f0: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
e300: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
e310: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
e320: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
e330: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
e340: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
e350: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
e360: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
e370: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
e380: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
e390: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
e3a0: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
e3b0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
e3c0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
e3d0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
e3e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e3f0: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
e400: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
e410: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
e420: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
e430: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
e440: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
e450: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
e460: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
e470: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
e480: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
e490: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
e4a0: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
e4b0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
e4c0: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
e4d0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
e4e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
e4f0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
e500: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
e510: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
e520: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
e530: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
e540: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
e550: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
e560: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
e570: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
e580: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e590: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
e5a0: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
e5b0: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
e5c0: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
e5d0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
e5e0: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
e5f0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
e600: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
e610: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
e620: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
e630: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
e640: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
e650: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
e660: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
e670: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
e680: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e690: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
e6a0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
e6b0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
e6c0: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
e6d0: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
e6e0: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
e6f0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
e700: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
e710: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
e720: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
e730: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
e740: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
e750: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
e760: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
e770: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e780: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e790: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
e7a0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
e7b0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
e7c0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
e7e0: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
e7f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e800: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
e810: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
e820: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
e830: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
e840: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e850: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e860: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
e870: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
e880: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
e890: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
e8a0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
e8b0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
e8c0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
e8d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
e8e0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
e8f0: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
e900: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
e910: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
e920: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
e930: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
e940: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
e950: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
e960: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
e970: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
e980: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
e990: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
e9a0: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
e9b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e9c0: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
e9d0: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
e9e0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
e9f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ea00: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
ea10: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
ea20: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
ea30: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
ea40: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
ea50: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
ea60: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
ea70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea80: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
ea90: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
eaa0: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
eab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eac0: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
ead0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
eae0: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
eaf0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
eb00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
eb10: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
eb20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eb30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
eb40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
eb50: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
eb60: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
eb70: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
eb80: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
eb90: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
eba0: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
ebb0: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
ebc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
ebd0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
ebe0: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
ebf0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
ec00: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
ec10: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
ec20: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
ec30: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
ec40: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
ec50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
ec60: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
ec70: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
ec80: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
ec90: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
eca0: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
ecb0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
ecc0: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
ecd0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
ece0: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
ecf0: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
ed00: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
ed10: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
ed20: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
ed30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
ed40: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
ed50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
ed60: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
ed70: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
ed80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ed90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
eda0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
edb0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
edc0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
edd0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ede0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
edf0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
ee00: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
ee10: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
ee20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ee30: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ee40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ee50: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
ee60: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
ee70: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
ee80: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
ee90: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
eea0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
eeb0: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
eec0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
eed0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
eee0: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
eef0: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
ef00: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
ef10: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
ef20: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
ef30: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ef40: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
ef50: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
ef60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
ef70: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
ef80: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
ef90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
efa0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
efb0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
efc0: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
efd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
efe0: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
eff0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
f000: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
f010: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
f020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f030: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
f040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f050: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
f060: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
f080: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
f090: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
f0a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f0b0: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
f0c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f0d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f0e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
f0f0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
f130: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f140: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
f150: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f160: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f170: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
f180: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f190: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
f1a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
f1b0: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
f1c0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
f1d0: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
f1e0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f1f0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f200: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
f210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
f230: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
f240: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f250: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f260: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f270: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
f280: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f290: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
f2a0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
f2b0: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
f2c0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f2d0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
f2e0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
f2f0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
f300: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
f310: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f320: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
f330: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
f340: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
f350: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
f380: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
f390: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
f3a0: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
f3b0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
f3c0: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
f3d0: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
f3e0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
f3f0: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
f400: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
f410: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
f420: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
f430: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
f440: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f450: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f460: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f480: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f490: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
f4a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f4b0: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
f4c0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
f4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f4e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
f4f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f500: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
f510: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f530: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
f540: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
f550: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
f560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f570: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f590: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
f5a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f5b0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f5c0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
f5d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
f5e0: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
f5f0: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
f600: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
f610: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
f620: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
f630: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
f640: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
f650: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
f660: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
f670: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
f680: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
f690: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
f6a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f6b0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
f6c0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
f6d0: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
f6e0: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
f6f0: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
f700: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
f710: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
f720: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
f730: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
f740: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
f750: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
f760: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
f770: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
f780: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
f790: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
f7a0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
f7b0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
f7c0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
f7d0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f7e0: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
f7f0: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
f800: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f810: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
f820: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
f830: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f840: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
f850: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
f860: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f870: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
f880: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f890: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f8a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f8b0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f8c0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f8d0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f8e0: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f8f0: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f900: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f910: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f920: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f930: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f940: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f950: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f960: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f970: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f990: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f9a0: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f9b0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f9c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f9d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f9e0: 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
f9f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
fa00: 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
fa10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
fa20: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
fa30: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
fa40: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
fa50: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
fa60: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
fa70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
fa80: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
fa90: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
faa0: 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
fab0: 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
fac0: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
fad0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
fae0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
faf0: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
fb00: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
fb10: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
fb20: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
fb30: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
fb40: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
fb50: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
fb60: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
fb70: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
fb80: 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
fb90: 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
fba0: 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
fbb0: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
fbc0: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
fbd0: 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
fbe0: 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
fbf0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
fc00: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
fc10: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
fc20: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
fc30: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
fc40: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
fc50: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
fc60: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
fc70: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
fc80: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
fc90: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
fca0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
fcb0: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
fcc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fcd0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
fce0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
fcf0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
fd00: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
fd10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
fd20: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
fd30: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
fd40: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
fd50: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
fd60: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
fd70: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
fd80: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
fd90: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
fda0: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
fdb0: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
fdc0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
fdd0: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
fde0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
fdf0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
fe00: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
fe10: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
fe20: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
fe30: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
fe40: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
fe50: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
fe60: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
fe70: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
fe80: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fe90: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fea0: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
feb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
fec0: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
fed0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fee0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
fef0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
ff00: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
ff10: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
ff20: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
ff30: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
ff40: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
ff50: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
ff60: 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
ff70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ff80: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ff90: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ffa0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
ffb0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
ffc0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
ffd0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
ffe0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fff0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
10000 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10010 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10020 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10030 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10040 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10050 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
10060 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10070 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10080 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10090 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
100a0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
100b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
100c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
100d0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
100e0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
100f0 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
10100 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10110 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10120 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10140 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
10150 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
10160 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
10170 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
10180 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
10190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
101a0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
101b0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
101c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
101d0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
101e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
101f0 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
10200 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
10210 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
10220 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10230 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10240 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
10250 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
10260 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
10270 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
10280 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
10290 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
102a0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
102b0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
102c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
102d0 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
102e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
102f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10300 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10310 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
10320 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10330 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
10340 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10350 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10360 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10370 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
10380 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
10390 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
103a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
103b0 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
103c0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
103d0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
103e0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
103f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10400 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10410 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10420 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10430 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10440 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10450 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10460 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10470 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10480 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10490 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
104a0 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
104b0 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
104c0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
104d0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
104e0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
104f0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
10500 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
10510 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
10520 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10530 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10540 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10550 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10560 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10570 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10580 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
10590 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
105a0 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
105b0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
105c0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
105d0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
105e0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
105f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10600 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
10610 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10620 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
10630 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
10640 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
10650 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
10660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10670 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
10680 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
10690 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
106a0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
106b0 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
106c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
106d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
106e0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
106f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
10700 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
10710 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
10720 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
10730 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
10740 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10760 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
10770 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
10780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10790 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
107a0 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
107b0 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
107c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
107d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
107e0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
107f0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
10800 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10810 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10820 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10830 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
10840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10850 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
10860 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10870 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
10880 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
10890 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
108a0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
108b0 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
108c0 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
108d0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
108e0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
108f0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
10900 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
10910 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
10920 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10930 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10940 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10950 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
10960 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10970 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
10980 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
10990 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
109a0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
109b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
109c0 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
109d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
109e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
109f0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
10a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10a10 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
10a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10a30 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
10a40 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
10a50 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
10a60 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
10a70 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
10a80 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
10a90 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
10aa0 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
10ab0 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
10ac0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10ad0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
10ae0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
10af0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
10b00 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
10b10 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
10b20 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
10b30 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
10b40 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
10b50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10b60 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
10b70 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
10b80 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
10b90 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
10ba0 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
10bb0 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
10bc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10bd0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
10be0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
10bf0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
10c00 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
10c10 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
10c20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
10c30 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
10c40 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
10c50 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
10c60 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
10c70 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
10c80 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10c90 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10ca0 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
10cb0 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
10cc0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10cd0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
10ce0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
10cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
10d00 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
10d10 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d20 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10d30 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
10d40 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
10d50 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
10d60 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10d70 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
10d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10d90 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
10da0 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
10db0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
10dc0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
10dd0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
10de0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
10df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10e00 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
10e10 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
10e20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
10e30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10e40 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
10e50 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
10e60 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
10e70 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
10e80 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
10e90 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
10ea0 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
10eb0 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
10ec0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
10ed0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
10ee0 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
10ef0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
10f00 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
10f10 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
10f20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
10f30 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10f40 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
10f50 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
10f60 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
10f70 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
10f80 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
10f90 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
10fa0 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
10fb0 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
10fc0 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
10fd0 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
10fe0 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
10ff0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
11000 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
11010 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
11020 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
11030 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
11040 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
11050 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
11060 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
11070 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
11080 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
11090 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
110a0 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
110b0 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
110c0 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
110d0 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
110e0 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
110f0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
11100 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
11110 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
11120 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
11130 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
11140 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
11150 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
11160 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
11170 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
11180 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
11190 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
111a0 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
111b0 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
111c0 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
111d0 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
111e0 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
111f0 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a 2f   space here.  */
11200 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
11210 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65 74  mpSpace ) memset
11220 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
11230 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 4);.  }.}../
11240 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
11250 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
11260 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
11270 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
11280 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
11290 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
112a0 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
112b0 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
112c0 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
112d0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
112e0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
112f0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
11300 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
11310 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
11320 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
11330 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11340 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
11350 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
11360 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
11370 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
11380 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
11390 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
113a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
113b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
113c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
113d0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
113e0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
113f0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
11400 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
11410 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
11420 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
11430 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
11440 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
11450 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11460 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
11470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11480 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
11490 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
114a0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
114b0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
114c0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
114d0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
114e0 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
114f0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
11500 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
11510 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
11520 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11530 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
11540 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11550 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
11560 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
11570 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
11580 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
11590 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
115a0 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
115b0 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
115c0 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
115d0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
115e0 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
115f0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
11600 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11610 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
11620 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
11630 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
11640 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
11650 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
11660 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
11670 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
11680 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
11690 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
116a0 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
116b0 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
116c0 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
116d0 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
116e0 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
116f0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
11700 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
11710 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11720 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
11730 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
11740 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
11750 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
11760 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
11770 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
11780 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
11790 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
117a0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
117b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
117c0 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
117d0 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
117e0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
117f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
11800 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
11810 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
11820 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
11830 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
11840 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11850 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
11860 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
11870 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
11880 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
11890 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
118a0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
118b0 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
118c0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
118d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
118e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
118f0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
11900 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
11910 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
11920 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
11930 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
11940 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
11950 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
11960 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
11970 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
11980 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
11990 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
119a0 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
119b0 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
119c0 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
119d0 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
119e0 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
119f0 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
11a00 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
11a10 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
11a20 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
11a30 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
11a40 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
11a50 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
11a60 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
11a70 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
11a80 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
11a90 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
11aa0 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
11ab0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
11ac0 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
11ad0 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
11ae0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
11af0 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
11b00 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
11b10 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
11b20 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
11b30 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
11b40 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
11b50 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
11b60 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
11b70 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
11b80 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
11b90 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
11ba0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
11bb0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
11bc0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
11bd0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
11be0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11bf0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11c00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11c10 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11c20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11c30 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
11c40 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11c50 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
11c60 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
11c70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11c80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11c90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
11ca0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
11cb0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
11cc0 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
11cd0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
11ce0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
11cf0 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
11d00 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
11d10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11d20 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
11d30 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
11d40 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
11d50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11d60 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11d70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11d80 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
11d90 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
11da0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11db0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
11dc0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
11dd0 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
11de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11df0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
11e10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
11e20 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
11e30 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11e40 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11e50 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11e60 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11e70 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11e80 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11e90 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11ea0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11eb0 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
11ec0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
11ed0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
11ee0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
11ef0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
11f00 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
11f10 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11f20 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11f30 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11f40 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11f50 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11f60 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11f70 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11f80 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11f90 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11fa0 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11fb0 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
11fc0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
11fd0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
11fe0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
11ff0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12000 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12010 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
12020 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
12030 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12050 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
12060 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
12070 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
12080 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
12090 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
120a0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
120b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
120c0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
120d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
120e0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
120f0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
12100 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
12110 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
12120 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
12130 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
12140 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12150 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12160 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
12170 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
12180 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
12190 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
121a0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
121b0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
121c0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
121d0 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
121e0 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
121f0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
12200 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
12210 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
12220 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12230 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12240 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
12250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12260 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
12270 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
12280 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12290 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
122a0 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
122b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
122c0 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
122d0 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
122e0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
122f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12300 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
12310 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
12320 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
12330 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
12340 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
12350 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
12360 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
12370 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
12380 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
12390 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
123a0 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
123b0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
123c0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
123d0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
123e0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
123f0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
12400 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
12410 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
12420 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
12430 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
12440 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
12450 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
12460 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
12470 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
12480 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
12490 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
124a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
124b0 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
124c0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
124d0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
124e0 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
124f0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
12500 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
12510 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
12520 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
12530 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
12540 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
12550 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
12560 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
12570 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
12580 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
12590 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
125a0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
125b0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
125c0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
125d0 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
125e0 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
125f0 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
12600 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
12610 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
12620 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
12630 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
12640 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
12650 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
12660 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
12670 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
12680 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
12690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
126a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
126b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
126c0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
126d0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
126e0 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
126f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
12700 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
12710 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
12720 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
12730 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12750 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12760 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
12770 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
12780 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
12790 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
127a0 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
127b0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
127c0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
127d0 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
127e0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
127f0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
12800 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
12810 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
12820 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
12830 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12840 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
12850 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12860 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
12870 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
12880 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
12890 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
128a0 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
128b0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
128c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
128d0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
128e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
128f0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
12900 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
12910 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
12920 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
12930 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
12940 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
12950 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
12960 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
12970 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12980 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
129a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
129b0 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
129c0 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
129d0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
129e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
129f0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
12a00 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eSize;.}..#if de
12a10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
12a20 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
12a30 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
12a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12a50 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
12a60 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
12a70 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
12a80 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
12a90 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
12aa0 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
12ab0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
12ac0 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
12ad0 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
12ae0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
12af0 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
12b00 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
12b10 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
12b20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
12b30 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
12b40 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
12b50 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
12b60 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
12b70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
12b80 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
12b90 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
12ba0 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
12bb0 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
12bc0 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
12bd0 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
12be0 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
12bf0 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
12c00 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
12c10 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
12c20 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
12c30 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
12c40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12c50 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
12c60 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
12c70 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
12c80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12c90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12ca0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
12cb0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12cc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12cd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12ce0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
12cf0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
12d00 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12d20 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
12d30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12d40 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
12d50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12d60 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
12d70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
12d80 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
12d90 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
12da0 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
12db0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
12dc0 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
12dd0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
12de0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
12df0 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
12e00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
12e10 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
12e20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
12e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12e40 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
12e50 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
12e60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
12e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12e80 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12e90 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
12ea0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12eb0 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
12ec0 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
12ed0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
12ee0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
12ef0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
12f00 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
12f10 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
12f20 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
12f30 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
12f40 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
12f50 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
12f60 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
12f70 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
12f80 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
12f90 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
12fa0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12fb0 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
12fc0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
12fd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
12fe0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
12ff0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13000 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
13010 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
13020 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
13030 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
13040 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
13050 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
13060 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
13070 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
13080 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
13090 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
130a0 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
130b0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
130c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
130d0 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
130e0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
130f0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
13100 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
13110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
13120 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13130 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
13140 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
13150 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
13160 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13170 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
13180 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
13190 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
131a0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
131b0 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
131c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
131d0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
131e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
131f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13200 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn b;.}.#endif /
13210 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13220 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13230 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
13240 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
13250 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
13260 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
13270 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
13280 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
13290 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
132a0 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
132b0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
132c0 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
132d0 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
132e0 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
132f0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
13300 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
13310 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
13320 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
13330 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
13340 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
13350 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13360 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
13370 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
13380 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
13390 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
133a0 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
133b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
133c0 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
133d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
133e0 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
133f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13400 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13410 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
13420 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
13430 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13440 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
13450 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13460 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
13470 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
13480 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
13490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
134a0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
134b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
134c0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
134d0 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
134e0 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
134f0 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
13500 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13510 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13520 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13530 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
13540 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
13550 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
13560 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
13570 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
13580 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13590 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
135a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
135b0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
135c0 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
135d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
135e0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
135f0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
13600 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
13610 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
13620 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
13630 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
13640 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
13650 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13660 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
13670 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
13680 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13690 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
136a0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
136b0 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
136c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
136d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
136e0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
136f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
13700 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
13710 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
13720 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
13730 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
13740 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
13750 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13760 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
13770 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
13780 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
13790 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
137a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
137b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
137c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
137d0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
137e0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
137f0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
13800 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
13810 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
13820 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
13830 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
13840 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
13850 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
13860 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13880 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
13890 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
138a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
138b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
138c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
138d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
138e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
138f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13900 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13910 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
13920 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
13930 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
13940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13950 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
13960 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
13970 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13980 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13990 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
139a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
139b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
139c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
139d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
139e0 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
139f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13a00 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
13a10 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
13a20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
13a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
13a40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
13a50 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
13a60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
13a70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
13a80 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
13a90 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
13aa0 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
13ab0 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
13ac0 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
13ad0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
13ae0 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
13af0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
13b00 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
13b10 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
13b20 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
13b30 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
13b40 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
13b50 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
13b60 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
13b70 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
13b80 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
13b90 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
13ba0 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
13bb0 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
13bc0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
13bd0 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
13be0 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
13bf0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
13c00 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
13c10 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
13c20 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13c30 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
13c40 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
13c50 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
13c60 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13c70 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
13c80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13c90 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
13ca0 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
13cb0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
13cc0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
13cd0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
13ce0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
13cf0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13d00 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13d10 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
13d20 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
13d30 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
13d40 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
13d50 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
13d60 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
13d70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13d80 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13da0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
13db0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
13dc0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
13dd0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
13de0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
13df0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
13e00 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
13e10 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
13e20 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
13e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13e40 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
13e50 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
13e60 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
13e70 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
13e80 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
13e90 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
13ea0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
13eb0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
13ec0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
13ed0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
13ee0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
13ef0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
13f00 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
13f10 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
13f20 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
13f30 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
13f40 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
13f50 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
13f60 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
13f70 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
13f80 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
13f90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
13fa0 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
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 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
13fd0 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
13fe0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
13ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14000 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
14010 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14020 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
14030 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64  sOpen==0 ){.#ifd
14040 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14050 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
14060 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66  L.        /* Def
14070 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65  ault to specifie
14080 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  d safety_level f
14090 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  or WAL mode */. 
140a0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
140b0 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62  db!=0 && pBt->db
140c0 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20  ->aDb!=0 ){.    
140d0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
140e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
140f0 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a   *db = pBt->db;.
14100 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44            Db *aD
14110 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20  b = db->aDb;.   
14120 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20         u8 level 
14130 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
14140 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
14150 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
14160 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14170 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61  Db[iDb].pBt && a
14180 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74  Db[iDb].pBt->pBt
14190 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==pBt ) break;. 
141a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
141b0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
141c0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
141d0 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62        level = db
141e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74  ->aDb[iDb].safet
141f0 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20  y_level;.       
14200 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44     if( !SQLITE_D
14210 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69  bSafetyLevelIsFi
14220 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20  xed(level) && . 
14230 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
14240 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
14250 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d  lValue(level) !=
14260 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14270 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
14280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14290 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
142a0 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
142b0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
142c0 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20  YLEVEL;.        
142d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
142e0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
142f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
14300 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
14310 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20  AFETYLEVEL, .   
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
14350 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
14360 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
14390 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b  >flags&SQLITE_Ck
143a0 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29  ptFullFSync)!=0)
143b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
143c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
143d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
143e0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
143f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14400 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
14410 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14420 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
14430 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
14440 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
14450 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
14460 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
14470 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
14480 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
14490 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
144a0 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
144b0 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
144c0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
144d0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
144e0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
144f0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
14500 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
14510 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
14520 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
14530 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
14540 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
14550 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
14560 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
14570 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
14580 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14590 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
145a0 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
145b0 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
145c0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
145d0 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
145e0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
145f0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
14600 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
14610 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
14620 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
14630 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
14640 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14650 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14660 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
14670 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
14680 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
14690 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
146a0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
146b0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
146c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
146d0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
146e0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
146f0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
14700 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
14710 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
14720 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
14730 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
14740 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
14750 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
14760 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
14770 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
14780 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
14790 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
147a0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
147b0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
147c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
147d0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
147e0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
147f0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
14800 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
14810 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
14820 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
14830 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
14840 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
14850 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
14860 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
14870 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
14880 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
14890 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
148a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
148b0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
148c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
148d0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
14910 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
14920 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14930 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
14940 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
14950 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
14960 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
14970 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
14980 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14990 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
149a0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
149b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
149c0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
149d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
149e0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
149f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14a00 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14a10 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
14a20 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14a30 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
14a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14a50 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
14a60 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14a70 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
14a80 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
14a90 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14aa0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
14ab0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
14ac0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
14ad0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
14ae0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
14af0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
14b00 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
14b10 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
14b20 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
14b30 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
14b40 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
14b50 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
14b60 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
14b70 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
14b80 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
14b90 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
14ba0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
14bb0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
14bc0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
14bd0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
14be0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
14bf0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
14c00 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
14c10 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
14c20 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
14c30 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
14c40 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
14c50 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
14c60 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
14c70 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
14c80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
14c90 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
14ca0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
14cb0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
14cc0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
14cd0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
14ce0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
14cf0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
14d00 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
14d10 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
14d20 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
14d30 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
14d40 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
14d50 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
14d60 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
14d70 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
14d80 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
14d90 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
14da0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
14db0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
14dc0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
14dd0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
14de0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14df0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14e00 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
14e10 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
14e20 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
14e30 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
14e40 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
14e50 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
14e60 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
14e70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
14e80 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
14e90 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
14ea0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
14eb0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
14ec0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
14ed0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
14ee0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
14ef0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
14f00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14f10 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
14f20 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
14f30 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
14f40 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
14f50 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14f60 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
14f70 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
14f80 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
14f90 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
14fa0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
14fb0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
14fc0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
14fd0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
14fe0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
14ff0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
15000 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
15010 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
15020 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
15030 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
15040 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
15050 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
15060 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
15070 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
15080 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
15090 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
150a0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
150b0 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75 72  he databse.  Cur
150c0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
150d0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
150e0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
150f0 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
15100 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
15110 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
15120 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
15130 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
15140 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
15150 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
15160 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
15170 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
15180 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
15190 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
151a0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
151b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
151c0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
151d0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
151e0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
151f0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
15200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
15210 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
15220 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
15230 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
15240 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
15250 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
15260 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
15270 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
15280 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
15290 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
152a0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
152b0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
152c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
152d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
152e0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
152f0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
15300 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
15310 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15320 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
15330 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
15340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15350 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
15360 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
15370 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
15380 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
15390 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
153a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
153b0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
153c0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
153d0 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
153e0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
153f0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
15400 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
15410 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15420 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
15430 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
15440 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
15450 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
15460 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
15470 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
15480 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
15490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
154a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
154b0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
154c0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
154d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
154e0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
154f0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
15500 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
15510 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
15520 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
15530 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
15540 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
15550 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
15560 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
15570 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
15580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
15590 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
155a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
155b0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
155c0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
155d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
155e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
155f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15600 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
15610 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
15620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15630 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
15640 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
15650 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
15660 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
15670 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
15680 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15690 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
156a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
156b0 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
156c0 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
156d0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
156e0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
156f0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
15700 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
15710 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
15720 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
15730 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
15740 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
15750 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
15760 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
15770 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
15780 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
15790 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
157a0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
157b0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
157c0 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
157d0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
157e0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
157f0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
15800 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
15810 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
15820 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
15830 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
15840 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
15850 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
15860 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
15870 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
15880 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
15890 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
158a0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
158b0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
158c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
158d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
158e0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
158f0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
15900 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
15910 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15920 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
15930 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
15940 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
15950 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
15960 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
15970 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
15980 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
15990 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
159a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
159b0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
159c0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
159d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
159e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
159f0 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
15a00 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15a10 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
15a20 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
15a30 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
15a40 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
15a50 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
15a60 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
15a70 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
15a80 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
15a90 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
15aa0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
15ab0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
15ac0 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
15ad0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15ae0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15af0 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
15b00 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
15b10 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
15b20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15b30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
15b50 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
15b60 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
15b70 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
15b80 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
15b90 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
15ba0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
15bb0 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
15bc0 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
15bd0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
15be0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15bf0 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
15c00 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
15c10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
15c20 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
15c30 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
15c40 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
15c50 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
15c60 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
15c70 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
15c80 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
15c90 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
15ca0 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
15cb0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
15cc0 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
15cd0 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
15ce0 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
15cf0 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
15d00 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
15d10 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
15d20 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
15d30 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
15d40 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
15d50 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
15d60 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
15d70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
15d80 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
15d90 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
15da0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
15db0 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
15dc0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15dd0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
15de0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15df0 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
15e00 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
15e10 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
15e20 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
15e30 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
15e40 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
15e50 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
15e60 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15e70 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
15e80 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15e90 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
15ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
15eb0 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
15ec0 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
15ed0 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
15ee0 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
15ef0 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
15f00 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
15f10 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
15f20 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
15f30 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
15f40 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
15f50 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
15f60 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
15f70 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
15f80 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
15f90 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
15fa0 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
15fb0 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
15fc0 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
15fd0 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
15fe0 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
15ff0 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
16000 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
16010 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
16020 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
16030 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
16040 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
16050 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
16060 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
16070 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
16080 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
16090 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
160a0 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
160b0 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
160c0 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
160d0 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
160e0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
160f0 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
16100 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
16110 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
16120 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
16130 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
16140 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
16150 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
16160 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
16170 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
16180 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
16190 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
161a0 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
161b0 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
161c0 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
161d0 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
161e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
161f0 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
16200 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
16210 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
16220 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
16230 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16240 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
16250 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
16260 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16270 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
16280 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
16290 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
162a0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
162b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
162c0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
162d0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
162e0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
162f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
16300 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
16310 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
16320 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
16330 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
16340 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
16350 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
16360 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
16370 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16380 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
16390 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
163a0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
163b0 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
163c0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
163d0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
163e0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
163f0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
16400 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
16410 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
16420 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
16430 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
16440 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
16450 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
16460 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16470 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
16480 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
16490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
164a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
164b0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
164c0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
164d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
164e0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
164f0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
16500 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
16510 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
16520 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
16530 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
16540 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
16550 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
16560 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
16570 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
16580 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
16590 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
165a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
165b0 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
165c0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
165d0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
165e0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
165f0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
16600 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
16610 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
16620 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
16630 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
16640 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
16650 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
16660 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
16670 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
16680 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
16690 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
166a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
166b0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
166c0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
166d0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
166e0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
166f0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
16700 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
16710 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
16720 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
16730 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
16740 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
16750 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
16760 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
16770 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
16780 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
16790 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
167a0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
167b0 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
167c0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
167d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
167e0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
167f0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
16800 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
16810 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
16820 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
16830 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
16840 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
16850 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
16860 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
16870 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16880 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
16890 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
168a0 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
168b0 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
168c0 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
168d0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
168e0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
168f0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
16900 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
16910 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
16920 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
16930 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
16940 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
16950 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
16960 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
16970 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
16980 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
16990 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
169a0 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
169b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
169c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
169d0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
169e0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
169f0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
16a00 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
16a10 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
16a20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
16a30 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
16a40 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
16a50 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
16a60 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
16a70 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
16a80 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
16a90 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
16aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16ab0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
16ad0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16ae0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
16af0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16b00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16b30 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
16b40 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
16b50 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
16b60 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
16b70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16b90 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
16ba0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16bc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16be0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
16bf0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
16c00 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
16c10 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
16c20 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
16c30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16c40 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
16c50 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
16c60 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
16c70 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
16c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16c90 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16ca0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
16cb0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
16cc0 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
16cd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16ce0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
16cf0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
16d00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
16d10 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
16d20 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
16d30 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
16d40 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
16d50 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
16d60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
16d70 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
16d80 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
16d90 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
16da0 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
16db0 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
16dc0 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
16dd0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
16de0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
16df0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
16e00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
16e10 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
16e20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
16e30 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
16e40 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
16e50 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
16e60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
16e70 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
16e80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16e90 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16ea0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
16eb0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
16ec0 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
16ed0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
16ee0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
16ef0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
16f00 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
16f10 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16f20 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
16f30 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
16f40 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
16f50 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
16f60 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
16f70 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
16f80 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
16f90 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
16fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16fb0 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
16fc0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
16fd0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
16fe0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
16ff0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
17000 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
17010 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
17020 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
17030 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
17040 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
17050 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
17060 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
17070 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
17080 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17090 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
170a0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
170b0 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
170c0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
170d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
170e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
170f0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
17100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17120 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
17130 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
17140 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
17150 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
17170 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
17180 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17190 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
171a0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
171b0 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
171c0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
171d0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
171e0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
171f0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
17200 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
17210 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
17220 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
17230 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17240 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
17250 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
17260 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
17270 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
17280 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
17290 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
172a0 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
172b0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
172c0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
172d0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
172e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
172f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17300 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17310 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
17320 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
17330 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
17340 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
17350 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
17360 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
17370 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
17380 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
17390 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
173a0 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
173b0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
173c0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
173d0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
173e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
173f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
17400 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
17410 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
17440 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
17450 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
17480 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
17490 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
174c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
174d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
174e0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
174f0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
17500 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
17510 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
17520 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
17530 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17540 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
17550 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
17560 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
17570 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
17580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17590 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
175a0 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
175b0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
175c0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
175d0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
175e0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
175f0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
17600 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
17610 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
17620 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
17630 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
17640 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
17650 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
17660 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
17670 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
17680 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
17690 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
176a0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
176b0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
176c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
176d0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
176e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
176f0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17700 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
17710 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17720 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
17730 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
17740 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
17750 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
17760 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
17770 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
17780 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17790 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
177a0 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
177b0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
177c0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
177d0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
177e0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
177f0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
17800 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
17810 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
17820 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
17830 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
17840 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
17850 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
17860 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
17870 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17880 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
17890 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
178a0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
178b0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
178c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
178d0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
178e0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
178f0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
17900 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17920 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
17930 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
17940 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
17950 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
17960 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
17970 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
17980 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17990 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
179a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
179b0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
179c0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
179d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
179e0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
179f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
17a00 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
17a10 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
17a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17a30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
17a40 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
17a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17a60 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
17a70 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
17a80 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
17a90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17aa0 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
17ab0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
17ac0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
17ad0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
17ae0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
17af0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
17b00 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
17b10 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
17b20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17b30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17b40 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
17b50 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
17b60 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
17b70 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
17b80 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
17b90 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
17ba0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
17bb0 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
17bc0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
17bd0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
17be0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
17bf0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
17c00 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
17c10 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
17c20 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
17c30 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
17c40 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
17c50 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
17c60 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
17c70 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
17c80 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
17c90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
17ca0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
17cb0 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
17cc0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
17cd0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
17ce0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
17cf0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
17d00 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
17d10 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
17d20 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
17d30 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17d40 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
17d50 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
17d60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
17d90 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
17da0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
17db0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
17dc0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
17dd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17df0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
17e00 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
17e10 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
17e20 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
17e30 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
17e40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
17e50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
17e60 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
17e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17e80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17ea0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
17eb0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
17ec0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
17ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
17ee0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
17ef0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
17f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17f10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
17f20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
17f30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
17f40 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
17f50 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
17f60 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
17f70 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
17f80 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
17f90 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
17fa0 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
17fb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
17fc0 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
17fd0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
17fe0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
17ff0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
18000 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
18010 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
18020 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
18030 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
18040 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
18050 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
18060 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
18070 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
18080 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
18090 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
180a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
180b0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
180c0 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
180d0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
180e0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
180f0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
18100 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18110 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
18120 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
18130 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
18140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18150 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
18160 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
18170 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
18180 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
18190 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
181a0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
181b0 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
181c0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
181d0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
181e0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
181f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
18200 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
18210 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
18220 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
18230 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
18240 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
18250 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
18260 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
18270 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
18280 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
18290 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
182a0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
182b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
182c0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
182d0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
182e0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
182f0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
18300 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
18310 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
18320 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18330 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
18340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
18350 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
18360 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
18370 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
18380 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
18390 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
183a0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
183b0 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
183c0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
183d0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
183e0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
183f0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
18400 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
18410 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
18420 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
18430 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
18440 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
18450 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
18460 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
18470 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
18490 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
184a0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
184b0 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
184c0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
184d0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
184e0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
184f0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
18500 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
18510 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
18520 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
18530 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
18540 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
18550 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
18560 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
18570 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
18580 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
18590 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
185a0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
185b0 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
185c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
185d0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
185e0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
185f0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
18600 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
18610 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
18620 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
18630 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
18640 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
18650 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
18660 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
18670 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
18680 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
18690 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
186a0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
186b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
186c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
186d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
186e0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
186f0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
18700 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
18710 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
18720 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
18730 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
18740 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
18750 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
18760 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
187a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
187b0 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
187c0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
187d0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
187e0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
187f0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
18800 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
18810 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
18820 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
18830 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
18840 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
18850 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
18860 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
18870 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18880 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
18890 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
188a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
188b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
188c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
188d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
188e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
188f0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
18900 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
18910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18920 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
18930 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
18940 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18950 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
18960 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
18970 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
18980 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
18990 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
189a0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
189b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
189c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
189d0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
189e0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
189f0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
18a00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
18a10 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
18a20 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
18a30 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
18a40 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
18a50 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
18a60 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
18a70 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
18a80 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
18a90 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
18aa0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
18ab0 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
18ac0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
18ad0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
18ae0 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
18af0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
18b00 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
18b10 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
18b20 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
18b30 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
18b40 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
18b50 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
18b60 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
18b70 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
18b80 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
18b90 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
18ba0 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
18bb0 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
18bc0 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
18bd0 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
18be0 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
18bf0 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
18c00 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
18c10 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
18c20 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
18c30 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
18c40 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18c50 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
18c60 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
18c70 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
18c80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
18c90 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
18ca0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
18cb0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
18cc0 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
18cd0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
18ce0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
18cf0 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
18d00 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
18d10 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
18d20 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
18d30 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
18d40 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
18d50 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
18d60 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
18d70 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
18d80 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20  cuum-on-commmit 
18d90 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
18da0 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
18db0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18dc0 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
18dd0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
18de0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
18df0 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
18e00 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
18e10 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
18e20 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
18e30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
18e40 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
18e50 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
18e60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18e70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18e80 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18e90 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
18ea0 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
18eb0 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
18ec0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18ed0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
18ee0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18ef0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
18f00 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
18f10 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
18f20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
18f30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18f40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
18f50 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
18f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
18f70 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
18f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
18f90 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
18fa0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
18fb0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
18fc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18fd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18fe0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18ff0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
19000 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
19010 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19020 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19030 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
19040 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
19050 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
19060 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
19070 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
19080 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
19090 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
190a0 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
190b0 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
190c0 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
190d0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
190e0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
190f0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
19100 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
19110 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
19120 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
19130 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
19140 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
19150 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
19160 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
19170 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
19180 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
19190 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
191a0 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
191b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
191c0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
191d0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
191e0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
191f0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
19200 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
19210 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
19220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19230 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
19240 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
19250 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19260 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
19270 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
19280 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
19290 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
192a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
192b0 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
192c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
192d0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
192e0 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
192f0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
19300 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
19310 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
19320 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
19330 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
19340 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
19350 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
19360 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
19370 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
19380 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
19390 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
193a0 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
193b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
193c0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
193d0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
193e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
193f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19410 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
19420 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
19430 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
19440 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
19450 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
19460 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
19470 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
19480 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
19490 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
194a0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
194b0 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
194c0 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
194d0 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
194e0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
194f0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
19500 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
19510 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
19520 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
19530 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
19540 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
19550 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
19560 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
19570 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
19580 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
19590 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
195a0 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
195b0 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
195c0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
195d0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
195e0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
195f0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
19600 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
19610 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
19620 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
19630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19640 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
19650 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
19660 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
19670 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
19680 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19690 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
196a0 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
196b0 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
196c0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
196d0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
196e0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
196f0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
19700 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
19710 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
19720 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
19730 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
19740 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
19750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19770 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19790 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
197a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
197b0 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
197c0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
197d0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
197e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
197f0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
19800 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
19810 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
19820 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
19830 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
19840 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
19850 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19860 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
19870 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
19880 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
19890 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
198a0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
198b0 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
198c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
198d0 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
198e0 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
198f0 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
19900 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
19910 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
19920 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
19930 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
19940 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
19950 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
19960 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
19970 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
19980 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199a0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
199b0 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
199c0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
199d0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
199e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
199f0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
19a00 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
19a10 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
19a40 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
19a50 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
19a60 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
19a70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
19a80 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
19a90 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
19aa0 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
19ab0 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
19ac0 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
19ad0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
19ae0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
19af0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
19b00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
19b10 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
19b20 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
19b30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
19b40 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
19b50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19b60 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
19b70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19b80 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
19b90 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19ba0 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
19bb0 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
19bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19bd0 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
19be0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
19bf0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
19c00 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
19c10 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
19c20 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
19c30 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
19c40 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
19c50 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
19c60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
19c70 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
19c80 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
19c90 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
19ca0 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
19cb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
19cc0 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
19cd0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
19ce0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
19cf0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
19d00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19d10 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19d20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
19d30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19d40 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
19d50 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19d60 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19d70 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
19d80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
19d90 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
19da0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
19db0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
19dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
19dd0 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
19de0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
19df0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
19e00 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
19e10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
19e20 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
19e30 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
19e40 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
19e50 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
19e60 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
19e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19e80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
19e90 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
19ea0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
19eb0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
19ec0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
19ed0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
19ef0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
19f00 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
19f10 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
19f20 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
19f30 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
19f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19f60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19f70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19f80 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
19f90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
19fa0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
19fb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
19fc0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
19fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
19fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19ff0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1a000 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1a010 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1a020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a030 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a040 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
1a050 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1a060 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
1a070 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
1a080 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
1a090 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1a0a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
1a0b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a0c0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
1a0d0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
1a0e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a0f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1a100 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1a110 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
1a120 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
1a130 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
1a140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1a150 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
1a160 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
1a170 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
1a180 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
1a190 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
1a1a0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
1a1b0 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
1a1c0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
1a1d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1a1e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a1f0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
1a200 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
1a210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1a220 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1a230 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
1a240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a250 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1a260 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1a270 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1a280 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
1a290 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1a2a0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
1a2b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1a2c0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
1a2d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1a2e0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
1a2f0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
1a300 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
1a310 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
1a320 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1a330 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
1a340 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
1a350 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
1a360 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
1a370 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
1a380 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
1a390 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
1a3a0 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
1a3b0 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
1a3c0 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
1a3d0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1a3e0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
1a3f0 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
1a400 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
1a410 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1a420 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
1a430 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1a440 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
1a450 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
1a460 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1a470 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1a480 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1a490 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1a4a0 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1a4b0 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1a4c0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a4d0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1a4e0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1a4f0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1a500 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a510 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1a520 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1a530 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1a540 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1a550 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1a560 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1a570 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1a580 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1a590 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a5a0 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1a5b0 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1a5c0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1a5d0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1a5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1a5f0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1a600 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1a610 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1a620 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1a630 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1a640 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1a650 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1a660 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1a670 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1a680 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1a690 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a6a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1a6b0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1a6c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1a6d0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a6e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1a6f0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1a700 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1a710 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1a720 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1a730 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1a740 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1a750 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1a760 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1a770 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1a780 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1a790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a7a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a7b0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1a7c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1a7d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1a7e0 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1a7f0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1a800 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a810 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1a820 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a830 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1a840 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1a850 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1a860 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1a870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1a880 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1a890 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1a8a0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1a8b0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1a8c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1a8d0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1a8e0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1a8f0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1a900 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1a910 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1a920 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1a930 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1a940 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1a950 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1a960 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1a970 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1a980 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1a990 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1a9a0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1a9b0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1a9c0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1a9d0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1a9e0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1a9f0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1aa00 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1aa10 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1aa20 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1aa30 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1aa40 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1aa50 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1aa60 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1aa70 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1aa80 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1aa90 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1aaa0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1aab0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1aac0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1aad0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1aae0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1aaf0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1ab00 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1ab10 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1ab20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1ab30 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1ab40 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1ab50 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1ab60 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1ab70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1ab80 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1ab90 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1aba0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1abb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1abc0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1abd0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1abe0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1abf0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1ac00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1ac10 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1ac20 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1ac30 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1ac40 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1ac50 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1ac60 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1ac70 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1ac80 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1ac90 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1aca0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1acb0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1acc0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1acd0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1ace0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1acf0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1ad00 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1ad10 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1ad20 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1ad30 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1ad40 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1ad50 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1ad60 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1ad70 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1ad80 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1ad90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ada0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1adb0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1adc0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1add0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1ade0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1adf0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1ae00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ae10 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1ae20 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ae30 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1ae40 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ae50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ae60 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1ae70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ae80 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1ae90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1aea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1aeb0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1aec0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1aed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1aee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1aef0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1af00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1af10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1af20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1af30 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1af40 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1af50 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1af60 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1af70 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1af80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1af90 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1afa0 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1afb0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1afc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1afd0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1afe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aff0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b000 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1b010 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1b020 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1b030 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1b040 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1b050 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1b060 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1b070 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1b080 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1b090 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1b0a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1b0b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1b0c0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1b0d0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1b0e0 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1b0f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b100 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1b110 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1b120 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1b130 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1b140 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1b150 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1b160 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1b170 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1b180 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1b190 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1b1a0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1b1b0 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1b1c0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1b1d0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1b1e0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1b1f0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1b200 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1b210 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1b220 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1b230 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1b240 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1b250 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1b260 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1b270 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1b280 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1b290 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1b2a0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1b2b0 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1b2c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1b2d0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1b2e0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1b2f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1b300 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1b310 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1b320 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1b330 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1b340 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1b350 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1b360 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1b370 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1b380 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b390 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1b3a0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1b3b0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1b3c0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1b3d0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1b3e0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1b3f0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1b400 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1b410 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1b420 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1b430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b440 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1b450 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1b460 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1b470 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1b480 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1b490 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1b4a0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1b4b0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1b4c0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1b4d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1b4e0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1b4f0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b500 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1b510 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1b530 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1b540 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1b550 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1b560 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1b570 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1b580 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1b590 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1b5a0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1b5b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b5c0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1b5d0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1b5e0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1b5f0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1b600 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1b610 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1b620 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1b630 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1b640 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1b650 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1b660 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1b670 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1b680 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1b690 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1b6a0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1b6b0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1b6c0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1b6d0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1b6e0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1b6f0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1b700 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1b710 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1b720 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1b730 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1b740 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1b750 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1b760 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1b770 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1b780 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1b790 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1b7a0 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1b7b0 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1b7c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1b7d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1b7e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b7f0 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1b800 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1b810 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1b820 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1b830 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1b840 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1b850 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1b860 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1b870 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1b880 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1b890 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1b8a0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1b8b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1b8c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1b8d0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1b8e0 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1b8f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1b900 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1b910 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1b920 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1b930 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1b940 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1b950 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1b960 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1b970 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1b980 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1b990 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1b9a0 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1b9b0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1b9c0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1b9d0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1b9e0 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1b9f0 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1ba00 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1ba10 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1ba20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1ba30 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1ba40 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1ba50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1ba60 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1ba70 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1ba80 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1ba90 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1baa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bab0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1bac0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1bad0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1bae0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1baf0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1bb00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bb10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1bb20 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1bb30 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1bb40 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1bb50 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1bb60 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1bb70 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1bb80 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1bb90 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1bba0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1bbb0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1bbc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1bbd0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1bbe0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1bbf0 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1bc00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1bc10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1bc20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1bc30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1bc40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1bc50 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1bc60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bc70 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1bc80 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1bc90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1bca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1bcb0 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1bcc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bcd0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1bce0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1bcf0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1bd00 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1bd10 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1bd20 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1bd30 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1bd40 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1bd50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bd60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bd70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1bd80 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1bd90 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1bda0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bdb0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1bdc0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1bdd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1bde0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1bdf0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1be00 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1be10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1be20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1be30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1be40 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1be50 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1be60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1be70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1be80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1be90 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1bea0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1beb0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1bec0 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1bed0 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1bee0 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
1bef0 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
1bf00 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
1bf10 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1bf20 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1bf30 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
1bf40 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
1bf50 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1bf60 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1bf70 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
1bf80 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
1bf90 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1bfa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bfb0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1bfc0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1bfd0 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
1bfe0 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
1bff0 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
1c000 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
1c010 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
1c020 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
1c030 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
1c040 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
1c050 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1c060 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
1c070 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
1c080 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
1c090 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
1c0a0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
1c0b0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
1c0c0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
1c0d0 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
1c0e0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
1c0f0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1c100 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1c110 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1c120 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
1c130 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
1c140 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65  ( pBtree==0 ) re
1c150 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  turn;.  sqlite3B
1c160 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1c170 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1c180 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1c190 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1c1a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1c1b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1c1c0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1c1d0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1c1e0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1c1f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1c200 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1c210 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1c220 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1c230 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1c240 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1c250 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1c260 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1c270 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1c280 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1c290 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1c2a0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1c2b0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1c2c0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1c2d0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1c2e0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1c2f0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1c300 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1c310 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1c320 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1c330 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1c340 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1c350 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1c360 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1c370 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1c380 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c390 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1c3a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1c3b0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1c3c0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1c3d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1c3e0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1c3f0 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
1c400 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
1c410 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1c420 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1c430 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c440 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
1c450 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
1c460 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
1c470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c480 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
1c490 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1c4a0 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 0);.  }else{
1c4b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c4c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1c4d0 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73  ripCode ){.    s
1c4e0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1c4f0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
1c500 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74  pCode);.  }.  bt
1c510 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c520 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1c530 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1c540 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1c550 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
1c560 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
1c570 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
1c580 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
1c590 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1c5a0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1c5b0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
1c5c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1c5d0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
1c5e0 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
1c5f0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
1c600 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
1c610 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
1c620 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
1c630 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
1c640 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
1c650 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1c660 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
1c670 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
1c680 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
1c690 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
1c6a0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
1c6b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c6c0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
1c6d0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
1c6e0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
1c6f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
1c700 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1c710 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
1c720 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1c730 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1c740 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
1c750 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
1c760 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
1c770 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1c780 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1c790 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1c7a0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
1c7b0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
1c7c0 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
1c7d0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1c7e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c7f0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c800 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c810 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c820 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c830 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c840 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c860 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
1c870 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
1c880 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1c890 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
1c8a0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
1c8b0 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
1c8c0 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
1c8d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
1c8e0 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
1c8f0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
1c900 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
1c910 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c920 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c930 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
1c940 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
1c950 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1c960 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
1c970 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
1c980 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
1c990 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
1c9a0 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
1c9b0 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
1c9c0 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
1c9d0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
1c9e0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
1c9f0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
1ca00 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
1ca10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
1ca20 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
1ca30 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
1ca40 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
1ca50 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
1ca60 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
1ca70 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
1ca80 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
1ca90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1caa0 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
1cab0 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
1cac0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1cad0 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
1cae0 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
1caf0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1cb00 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1cb10 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
1cb20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
1cb30 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
1cb40 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
1cb50 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1cb60 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
1cb70 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
1cb80 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1cb90 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
1cba0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
1cbb0 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
1cbc0 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
1cbd0 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
1cbe0 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
1cbf0 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
1cc00 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
1cc10 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
1cc20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1cc30 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
1cc40 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1cc50 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
1cc60 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
1cc70 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
1cc80 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1cc90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1cca0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1ccb0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1ccc0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
1ccd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1cce0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
1ccf0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1cd00 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20  AD_ONLY)==0 );. 
1cd10 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1cd20 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1cd30 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1cd40 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1cd50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1cd60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1cd70 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1cd80 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1cd90 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1cda0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1cdb0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1cdc0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1cdd0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1cde0 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1cdf0 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1ce00 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1ce10 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1ce20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1ce30 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1ce40 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1ce50 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1ce60 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1ce70 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1ce80 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1ce90 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1cea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1ceb0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1cec0 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1ced0 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1cee0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1cef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cf00 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1cf10 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1cf20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1cf30 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1cf40 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1cf50 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1cf60 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1cf70 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1cf80 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1cf90 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1cfa0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1cfb0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1cfc0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1cfd0 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1cfe0 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1cff0 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1d000 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d010 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1d020 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1d030 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1d040 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1d050 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1d060 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1d070 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1d080 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1d090 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1d0a0 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1d0b0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1d0c0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1d0d0 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1d0e0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1d0f0 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1d100 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1d110 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1d120 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1d130 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d140 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1d150 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1d160 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1d170 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d180 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1d190 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d1a0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1d1b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1d1c0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1d1d0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1d1e0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1d1f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1d200 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d210 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1d220 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1d230 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1d240 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1d250 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1d260 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1d270 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1d280 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1d290 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1d2a0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1d2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d2c0 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1d2d0 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
1d2e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
1d2f0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
1d300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
1d310 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
1d320 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1d330 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1d340 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1d350 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1d360 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
1d370 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
1d380 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
1d390 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
1d3a0 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
1d3b0 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
1d3c0 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
1d3d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1d3e0 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
1d3f0 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
1d400 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
1d410 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
1d420 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
1d430 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
1d440 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
1d450 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d460 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1d470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1d480 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1d490 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1d4a0 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1d4b0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1d4c0 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1d4d0 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1d4e0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1d4f0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1d500 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1d510 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1d520 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1d530 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1d540 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1d550 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1d560 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1d570 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1d580 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1d590 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1d5a0 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1d5b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d5c0 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1d5d0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1d5e0 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1d5f0 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1d600 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1d610 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1d620 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1d630 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1d640 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1d650 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1d660 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1d670 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1d680 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1d690 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1d6a0 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1d6b0 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1d6c0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1d6d0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1d6e0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1d6f0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1d700 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1d710 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d720 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1d730 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1d740 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1d750 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1d760 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1d770 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1d780 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1d790 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1d7a0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1d7b0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1d7c0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1d7d0 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1d7e0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1d7f0 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1d800 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1d810 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1d820 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1d830 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1d840 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1d850 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1d860 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1d870 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1d880 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1d890 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1d8a0 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1d8b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1d8c0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1d8d0 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1d8e0 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1d8f0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1d900 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1d910 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1d920 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1d930 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1d940 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1d950 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1d960 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1d970 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1d980 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1d990 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1d9a0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1d9b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1d9c0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1d9d0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1d9e0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1d9f0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1da00 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1da10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1da40 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1da70 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1da80 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1da90 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1dac0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1dad0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1dae0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1daf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1db00 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1db10 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1db20 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1db30 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1db40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1db50 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1db60 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1db70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1db80 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1db90 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1dba0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1dbb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1dbc0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1dbd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1dbe0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1dbf0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1dc00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1dc10 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1dc20 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1dc30 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1dc40 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1dc50 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1dc60 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1dc70 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1dc80 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1dc90 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1dca0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1dcb0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1dcc0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1dcd0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1dce0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1dcf0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1dd00 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1dd10 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1dd20 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1dd30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1dd40 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1dd50 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1dd60 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1dd70 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1dd80 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1dd90 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1dda0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1ddb0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1ddc0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1ddd0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1dde0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1ddf0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1de00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1de10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1de20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1de30 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1de40 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e  wrFlag && (pBt->
1de50 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1de60 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b  EAD_ONLY)!=0) ){
1de70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1de80 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1de90 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1dea0 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1deb0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1dec0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1ded0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1dee0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1def0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1df00 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1df10 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1df20 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1df30 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1df40 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1df50 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1df60 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1df70 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1df80 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1df90 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1dfa0 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1dfb0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1dfc0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1dfd0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1dfe0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
1dff0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1e000 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
1e010 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
1e020 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
1e030 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1e040 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1e050 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1e060 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1e070 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1e080 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1e090 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1e0a0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1e0b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1e0c0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
1e0d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1e0e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e0f0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1e130 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1e170 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1e180 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e1b0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1e1c0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1e1d0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1e1e0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1e1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1e200 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1e210 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1e220 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1e250 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1e260 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1e270 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1e280 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1e290 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1e2a0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1e2b0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1e2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1e2d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1e2e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1e2f0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1e300 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1e310 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1e320 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1e330 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1e340 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1e350 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1e360 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1e370 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1e380 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1e390 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1e3a0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1e3b0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1e3c0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1e3d0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1e3e0 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1e3f0 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1e400 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1e410 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1e420 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1e430 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1e440 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1e450 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1e460 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1e470 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1e480 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1e490 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1e4a0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1e4b0 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1e4c0 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1e4d0 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1e4e0 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1e4f0 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1e500 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1e510 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1e520 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1e530 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1e540 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1e550 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1e560 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1e570 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1e580 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1e590 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1e5a0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1e5b0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1e5c0 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1e5d0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1e5e0 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1e5f0 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1e600 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1e610 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1e620 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1e630 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1e640 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1e650 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1e660 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1e670 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1e680 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1e690 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1e6a0 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1e6b0 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1e6c0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1e6d0 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1e6e0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1e6f0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1e700 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1e710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e720 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1e730 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1e740 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1e750 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1e760 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1e770 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1e780 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1e790 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1e7a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1e7b0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1e7c0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1e7d0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1e7e0 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1e7f0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1e800 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1e810 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e820 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1e830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1e840 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1e850 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
1e860 65 33 44 62 46 72 65 65 28 70 42 74 72 65 65 2d  e3DbFree(pBtree-
1e870 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
1e880 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
1e890 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1e8a0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1e8b0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1e8c0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1e8d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e8e0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1e8f0 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1e900 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1e910 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1e920 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1e930 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1e940 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e950 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1e960 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1e970 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1e980 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1e990 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1e9a0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1e9b0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1e9c0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1e9d0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1e9e0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1e9f0 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1ea00 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1ea10 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1ea20 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1ea30 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1ea40 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1ea50 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1ea60 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1ea70 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1ea80 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1ea90 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1eaa0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1eab0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1eac0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1ead0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1eae0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1eaf0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1eb00 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1eb10 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1eb20 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1eb30 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1eb40 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1eb50 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1eb60 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1eb70 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1eb80 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1eb90 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1eba0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1ebb0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1ebc0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1ebd0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1ebe0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1ebf0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1ec00 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1ec10 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1ec20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1ec30 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1ec40 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1ec50 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1ec60 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1ec70 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1ec80 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1ec90 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
1eca0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1ecb0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1ecc0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1ecd0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1ece0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ecf0 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1ed00 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1ed10 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1ed20 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1ed30 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1ed40 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1ed50 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1ed60 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1ed70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ed80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1ed90 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1eda0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1edb0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1edc0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1edd0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1ede0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1edf0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1ee00 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1ee10 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
1ee20 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
1ee30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee40 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1ee50 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1ee60 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1ee70 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1ee80 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1ee90 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1eea0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1eeb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1eec0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1eed0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1ef20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1ef30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1ef70 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1ef80 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1efc0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1efd0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1efe0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1eff0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1f000 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70  ;        \.    p
1f010 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
1f020 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65            \.  }e
1f060 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f0b0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1f0c0 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20  pCur);          
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f100 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43  }.#endif /* _MSC
1f110 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  _VER */..#ifndef
1f120 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
1f130 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
1f140 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1f150 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1f160 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
1f170 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
1f180 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
1f190 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
1f1a0 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
1f1b0 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
1f1c0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
1f1d0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
1f1e0 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
1f1f0 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
1f200 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
1f210 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
1f220 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1f230 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
1f240 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f250 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
1f260 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1f270 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
1f280 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f290 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
1f2a0 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
1f2b0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1f2c0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1f2d0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1f2e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1f2f0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1f300 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1f310 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1f320 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1f330 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1f340 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1f350 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1f360 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1f370 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1f380 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1f390 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1f3a0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1f3b0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1f3c0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1f3d0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
1f3e0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
1f3f0 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
1f400 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
1f410 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1f420 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
1f430 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1f440 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
1f450 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1f460 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
1f470 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
1f480 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1f490 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
1f4a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1f4b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1f4c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f4d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1f4e0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
1f4f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f500 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
1f510 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1f520 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
1f530 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pSize = 0;.  }el
1f540 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49  se{.    getCellI
1f550 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a  nfo(pCur);.    *
1f560 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1f570 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  fo.nKey;.  }.  r
1f580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
1f5a0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
1f5b0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
1f5c0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
1f5d0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
1f5e0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1f5f0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
1f600 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
1f610 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
1f620 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1f630 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
1f640 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
1f650 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1f660 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
1f670 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
1f680 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
1f690 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
1f6a0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
1f6b0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
1f6c0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1f6d0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
1f6e0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
1f6f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1f700 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
1f710 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
1f720 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
1f730 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
1f740 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
1f750 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1f760 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
1f770 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
1f780 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
1f790 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1f7a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f7b0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1f7c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1f7d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1f7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f7f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f800 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
1f810 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1f820 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
1f830 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65  info.nData;.  re
1f840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f850 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1f860 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f870 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1f880 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1f890 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1f8a0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1f8b0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1f8c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f8d0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f8e0 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1f8f0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1f900 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1f910 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1f920 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1f930 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1f940 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1f950 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1f960 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1f970 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1f980 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f990 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f9a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f9b0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1f9c0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1f9d0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1f9e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1f9f0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1fa00 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1fa10 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1fa20 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1fa30 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1fa40 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1fa50 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1fa60 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1fa70 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1fa80 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1fa90 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1faa0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1fab0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1fac0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1fad0 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1fae0 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1faf0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1fb00 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1fb10 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1fb20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1fb30 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1fb40 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1fb50 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1fb60 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1fb70 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1fb80 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1fb90 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1fba0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1fbb0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1fbc0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1fbd0 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1fbe0 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1fbf0 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1fc00 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1fc10 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1fc20 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1fc30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1fc40 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1fc50 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1fc60 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1fc70 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1fc80 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1fc90 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
1fca0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1fcb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1fcc0 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
1fcd0 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1fce0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
1fcf0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1fd00 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
1fd10 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1fd20 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
1fd30 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
1fd40 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1fd50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1fd60 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1fd70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1fd80 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1fd90 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
1fda0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
1fdb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1fdc0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
1fdd0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
1fde0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1fdf0 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
1fe00 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
1fe10 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
1fe20 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
1fe30 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
1fe40 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
1fe50 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
1fe60 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
1fe70 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
1fe80 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
1fe90 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
1fea0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
1feb0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
1fec0 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
1fed0 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
1fee0 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
1fef0 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
1ff00 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
1ff10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1ff20 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
1ff30 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
1ff40 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
1ff50 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
1ff60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ff70 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
1ff80 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
1ff90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1ffa0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
1ffb0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
1ffc0 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
1ffd0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
1ffe0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1fff0 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
20000 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
20010 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20020 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
20030 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
20040 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
20050 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
20060 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
20070 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20090 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
200a0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
200b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
200c0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
200d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
200e0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
200f0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
20100 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
20110 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
20120 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
20130 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20140 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
20150 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20170 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
20180 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
20190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
201a0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
201b0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
201c0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
201d0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
201e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
201f0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
20200 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
20210 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
20220 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
20230 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
20240 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
20250 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
20260 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
20270 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
20280 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20290 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
202a0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
202b0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
202c0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
202d0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
202e0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
202f0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
20300 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
20310 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
20320 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
20330 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
20340 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
20350 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
20360 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
20370 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
20380 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
20390 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
203a0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
203b0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
203c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
203d0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
203e0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
203f0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
20400 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
20410 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
20420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
20430 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
20440 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
20450 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
20460 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20470 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
20480 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
20490 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
204a0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
204b0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
204e0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
204f0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
20500 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
20510 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
20520 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
20530 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
20540 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
20550 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
20560 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
20570 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
20580 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
205a0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
205b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
205c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
205d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
205e0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
205f0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
20600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
20610 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
20620 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
20630 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
20640 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
20650 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
20660 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
20670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20680 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20690 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
206a0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
206b0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
206c0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
206d0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
206e0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
206f0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
20700 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
20710 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
20720 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
20730 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
20740 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
20750 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
20760 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
20770 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
20780 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
20790 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
207a0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
207b0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
207c0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
207d0 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
207e0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
207f0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
20800 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
20810 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
20820 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
20830 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
20840 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
20850 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
20860 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
20870 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
20880 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
20890 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
208a0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
208b0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
208c0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
208d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
208e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
208f0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
20900 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
20910 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
20920 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
20930 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
20940 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
20950 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
20960 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
20970 79 20 0a 2a 2a 20 70 6f 70 6c 75 61 74 65 73 20  y .** popluates 
20980 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
20990 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
209a0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
209b0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
209c0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
209d0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
209e0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
209f0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
20a00 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
20a10 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
20a20 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
20a30 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
20a40 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20a50 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
20a60 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
20a70 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
20a80 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
20a90 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
20aa0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
20ab0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
20ac0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
20ad0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
20ae0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
20af0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
20b00 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
20b10 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
20b20 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
20b30 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
20b40 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
20b50 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
20b60 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
20b70 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
20b80 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
20b90 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
20ba0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
20bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
20bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
20bd0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
20be0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
20bf0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
20c00 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
20c10 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
20c20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
20c30 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
20c40 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
20c50 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
20c60 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
20c70 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
20c80 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
20c90 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
20ca0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
20cb0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
20cc0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
20cd0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
20ce0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
20cf0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
20d00 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
20d10 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
20d20 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
20d30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20d40 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
20d50 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
20d60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
20d70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
20d80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
20d90 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
20da0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
20db0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20dc0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20de0 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
20df0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
20e00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
20e10 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
20e20 41 44 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  AD.  int bEnd;  
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
20e60 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
20e70 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
20e80 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
20e90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20ea0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20eb0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20ec0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20ed0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20ee0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
20ef0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20f00 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20f10 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
20f20 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
20f30 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20        /* Always 
20f40 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
20f50 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
20f60 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
20f70 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
20f80 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
20f90 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
20fa0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
20fb0 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
20fc0 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
20fd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
20fe0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
20ff0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21000 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 28 6f  READ.  bEnd = (o
21010 66 66 73 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79 2b  ffset+amt==nKey+
21020 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
21030 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
21040 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d   NEVER(offset+am
21050 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  t > nKey+pCur->i
21060 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c  nfo.nData) .   |
21070 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
21080 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
21090 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
210a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
210b0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
210c0 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
210d0 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
210e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
210f0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
21100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21110 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
21120 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
21130 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
21140 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
21150 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
21160 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
21170 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
21180 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
21190 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
211a0 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
211b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
211c0 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
211d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
211e0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
211f0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
21200 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
21210 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
21220 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
21230 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
21240 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
21250 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
21260 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
21270 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
21280 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
21290 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
212a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
212b0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
212c0 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
212d0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
212e0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
212f0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
21300 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
21310 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
21320 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
21330 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
21340 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
21350 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
21360 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
21370 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
21380 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
21390 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
213a0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
213b0 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
213c0 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
213d0 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
213e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
213f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
21400 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
21410 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
21420 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
21430 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
21440 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
21450 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
21460 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
21470 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
21480 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
21490 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
214a0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
214b0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
214c0 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
214d0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
214e0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
214f0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
21500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21510 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
21520 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21530 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
21540 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
21550 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
21560 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
21570 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
21580 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
21590 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
215a0 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
215b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
215c0 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
215d0 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
215e0 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
215f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c  Cur->pBtree->db,
21600 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21610 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
21620 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
21630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
21640 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
21650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21660 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65  OMEM;.        }e
21670 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
21680 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
21690 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
216a0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
216b0 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
216c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
216d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
216e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
216f0 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61    memset(pCur->a
21700 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76  Overflow, 0, nOv
21710 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  fl*sizeof(Pgno))
21720 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
21730 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
21740 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
21750 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
21760 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
21770 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21780 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
21790 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
217a0 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
217b0 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
217c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
217d0 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
217e0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
217f0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
21800 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
21810 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
21820 4f 76 66 6c 29 21 3d 30 20 26 26 20 70 43 75 72  Ovfl)!=0 && pCur
21830 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
21840 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
21850 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
21860 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
21870 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21880 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21890 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
218a0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
218b0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
218c0 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
218d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
218e0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
218f0 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20  iIdx++){..      
21900 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
21910 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
21920 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
21930 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
21940 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
21950 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
21960 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)!=0 ){.    
21970 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
21980 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21990 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
219a0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
219b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
219c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
219d0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
219e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
219f0 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
21a00 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
21a10 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
21a20 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
21a30 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
21a40 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
21a50 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
21a60 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
21a70 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
21a80 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
21a90 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
21aa0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
21ab0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
21ac0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
21ad0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
21ae0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
21af0 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
21b00 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
21b10 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
21b20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
21b30 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
21b40 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
21b50 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
21b60 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
21b70 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
21b80 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
21b90 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
21ba0 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
21bb0 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
21bc0 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
21bd0 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
21be0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
21bf0 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
21c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
21c10 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
21c20 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
21c30 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
21c40 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21c50 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
21c60 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
21c70 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21c80 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
21c90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
21ca0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
21cb0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
21cc0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
21cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21ce0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
21cf0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
21d00 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
21d10 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
21d20 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
21d30 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
21d40 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
21d50 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
21d60 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
21d70 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
21d80 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
21d90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
21da0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
21db0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
21dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21dd0 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
21de0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
21df0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
21e00 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
21e10 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
21e20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
21e30 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
21e40 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
21e50 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
21e60 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
21e70 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
21e80 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
21e90 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
21ea0 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
21eb0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
21ec0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
21ed0 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
21ee0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
21ef0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
21f00 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
21f10 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
21f20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
21f30 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
21f40 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
21f50 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
21f60 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
21f70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
21f80 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
21f90 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
21fa0 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
21fb0 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
21fc0 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
21fd0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
21fe0 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
21ff0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22000 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
22010 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
22020 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
22030 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
22040 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
22050 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
22060 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
22070 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
22080 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
22090 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
220a0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
220b0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
220c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
220d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
220e0 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
220f0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
22120 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
22130 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
22170 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
22180 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
221b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
221c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
221d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
22200 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
22210 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
22220 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
22230 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
22240 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
22250 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
22260 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
22290 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
222a0 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
222b0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
222c0 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
222d0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  4];.          me
222e0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
222f0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
22300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22310 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
22320 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
22330 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
22340 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
22350 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
22360 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
22370 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22380 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
22390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
223a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
223b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
223c0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
223d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
223e0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
223f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
22400 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
22410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22420 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f  ((eOp&0x01)==0 ?
22430 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
22440 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
22450 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
22460 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22470 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
22480 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
22490 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
224a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
224b0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
224c0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
224d0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
224e0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
224f0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
22500 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
22510 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50  (eOp&0x01), pDbP
22520 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
22530 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22540 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
22550 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
22560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22570 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22580 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
22590 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
225a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
225b0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
225c0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
225d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
225e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
225f0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
22600 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22610 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
22620 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
22630 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
22640 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
22650 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
22660 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
22670 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
22680 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
22690 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
226a0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
226b0 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
226c0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
226d0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
226e0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
226f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
22700 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22710 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
22720 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
22730 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
22740 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
22750 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
22760 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
22770 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
22780 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
22790 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
227a0 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
227b0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
227c0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
227d0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
227e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
227f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22800 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
22810 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
22820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22830 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
22840 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22850 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
22860 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22870 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22880 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22890 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
228a0 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
228b0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
228c0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
228d0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
228e0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
228f0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
22900 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
22910 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
22920 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
22930 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
22940 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
22950 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
22960 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
22970 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
22980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
22990 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
229a0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
229b0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
229c0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
229d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
229e0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
229f0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
22a00 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
22a10 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
22a20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
22a30 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
22a40 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
22a50 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
22a60 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
22a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22a80 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
22a90 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
22aa0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
22ab0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
22ac0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
22ad0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
22ae0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22af0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22b00 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
22b10 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
22b20 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
22b40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22b50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22b70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
22b80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22b90 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22bb0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22bc0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22bd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22be0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
22bf0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22c00 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
22c10 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
22c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22c30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22c40 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
22c50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
22c60 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
22c70 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
22c80 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
22c90 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
22ca0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
22cb0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
22cc0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
22cd0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
22ce0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
22cf0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
22d00 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
22d10 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
22d20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
22d30 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
22d40 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
22d50 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
22d60 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
22d70 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
22d80 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
22d90 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
22da0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
22db0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
22dc0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
22dd0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
22de0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
22df0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
22e00 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
22e10 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
22e20 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
22e30 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
22e40 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
22e50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
22e60 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
22e70 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
22e80 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
22e90 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
22ea0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
22eb0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
22ec0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
22ed0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
22ee0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
22ef0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
22f00 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
22f10 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
22f20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
22f30 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
22f40 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
22f50 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
22f60 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
22f70 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
22f80 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
22f90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22fa0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
22fb0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
22fc0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
22fd0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
22fe0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
22ff0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
23000 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
23010 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
23020 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
23030 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
23040 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
23050 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
23060 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
23070 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
23080 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
23090 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
230a0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
230b0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
230c0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
230d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
230e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
230f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23100 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23110 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23120 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
23130 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
23140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
23150 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23160 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23170 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23180 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
23190 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
231a0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
231b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
231c0 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
231d0 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  *pAmt = pCur->in
231e0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74  fo.nLocal;.  ret
231f0 75 72 6e 20 28 76 6f 69 64 2a 29 28 70 43 75 72  urn (void*)(pCur
23200 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
23210 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
23220 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  r);.}.../*.** Fo
23230 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
23240 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
23250 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
23260 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
23270 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
23280 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
23290 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
232a0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
232b0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
232c0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
232d0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
232e0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
232f0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
23300 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
23310 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
23320 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
23330 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
23340 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
23350 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
23360 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
23370 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
23380 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
23390 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
233a0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
233b0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
233c0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
233d0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
233e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
233f0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
23400 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
23410 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
23420 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
23430 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
23440 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
23450 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
23460 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
23470 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
23480 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
23490 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
234a0 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
234b0 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
234c0 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e  ur, pAmt);.}.con
234d0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
234e0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
234f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23500 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
23510 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
23520 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
23530 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
23540 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
23550 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
23560 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
23570 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
23580 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
23590 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
235a0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
235b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
235c0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
235d0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
235e0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
235f0 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
23600 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
23610 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
23620 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
23630 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
23640 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
23650 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
23660 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
23670 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
23680 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
23690 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
236a0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
236b0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
236c0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
236d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
236e0 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
236f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
23700 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
23710 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
23720 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
23730 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23740 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23750 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23760 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23770 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23780 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
23790 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
237a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
237b0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
237c0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
237d0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
237e0 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
237f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23800 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
23810 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
23820 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
23830 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20  NewPage,.       
23840 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
23850 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
23860 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
23870 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
23880 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63  Y : 0);.  if( rc
23890 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
238a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
238b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
238c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
238d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
238e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
238f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23900 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23910 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
23920 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
23930 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  vfl);.  if( pNew
23940 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
23950 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
23960 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
23970 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
23980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23990 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
239a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
239b0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  E_OK;.}..#if 0./
239c0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
239d0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
239e0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
239f0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
23a00 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
23a10 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
23a20 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
23a30 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
23a40 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
23a50 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
23a60 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
23a70 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
23a80 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
23a90 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
23aa0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
23ab0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
23ac0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
23ad0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
23ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
23af0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
23b00 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
23b10 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
23b20 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
23b30 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
23b40 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
23b50 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
23b60 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
23b70 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
23b80 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
23b90 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
23ba0 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
23bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
23bc0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
23bd0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
23be0 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
23bf0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
23c00 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
23c10 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
23c20 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
23c30 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23c40 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
23c50 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
23c60 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
23c70 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
23c80 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
23c90 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
23ca0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
23cb0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
23cc0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
23cd0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
23ce0 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
23cf0 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
23d00 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
23d10 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
23d20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
23d30 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
23d40 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
23d50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23d60 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23d70 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23d80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23d90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23da0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23db0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23dc0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
23dd0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23de0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a  Cur->iPage] );..
23df0 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20    /* UPDATE: It 
23e00 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
23e10 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  ible for the con
23e20 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79  dition tested by
23e30 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a   the assert.  **
23e40 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74   below to be unt
23e50 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
23e60 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
23e70 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63  upt. This can oc
23e80 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20  cur if.  ** one 
23e90 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66  cursor has modif
23ea0 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74  ied page pParent
23eb0 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e   while a referen
23ec0 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64  ce to it is held
23ed0 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f   .  ** by a seco
23ee0 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68  nd cursor. Which
23ef0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23f00 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
23f10 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a  e is linked.  **
23f20 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
23f30 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
23f40 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70  ture in a corrup
23f50 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  t database.  */.
23f60 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61  #if 0.  assertPa
23f70 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
23f80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23f90 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
23fa0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23fb0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23fc0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
23fd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
23fe0 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  o.  );.#endif.  
23ff0 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
24000 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24010 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
24020 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
24030 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
24040 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
24050 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24060 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
24070 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
24080 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24090 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
240a0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
240b0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
240c0 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ovfl);.}../*.** 
240d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
240e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
240f0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
24100 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
24110 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24120 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
24130 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
24140 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
24150 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
24160 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
24170 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
24180 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
24190 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
241a0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
241b0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
241c0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
241d0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
241e0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
241f0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
24200 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
24210 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
24220 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
24230 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
24240 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
24250 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
24260 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
24270 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
24280 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
24290 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
242a0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
242b0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
242c0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
242d0 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
242e0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
242f0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
24300 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
24310 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
24320 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
24330 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
24340 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
24350 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
24360 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
24370 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
24380 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
24390 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
243a0 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
243b0 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
243c0 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
243d0 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
243e0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
243f0 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
24400 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
24410 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
24420 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
24430 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
24440 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
24450 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
24460 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
24470 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
24480 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
24490 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
244a0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
244b0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
244c0 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
244d0 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
244e0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
244f0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
24500 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
24510 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
24520 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
24530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24540 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24550 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
24570 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
24580 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
24590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
245a0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
245b0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
245c0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
245d0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
245e0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
245f0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
24600 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
24610 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
24620 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
24630 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
24640 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
24650 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
24660 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
24670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
24680 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
24690 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
246a0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
246b0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
246c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
246d0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
246e0 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c  Cur->iPage ) rel
246f0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
24700 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24710 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e--]);.  }else i
24720 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
24730 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
24740 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
24750 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
24760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24780 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
24790 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
247a0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
247b0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
247c0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
247d0 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63          (pCur->c
247e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
247f0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50  riteFlag)==0 ? P
24800 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
24810 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Y : 0);.    if( 
24820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24830 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
24840 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24850 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
24860 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
24870 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
24880 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
24890 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
248a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
248b0 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
248c0 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
248d0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
248e0 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
248f0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
24900 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
24910 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
24920 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
24930 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
24940 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
24950 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
24960 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
24970 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
24980 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
24990 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
249a0 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
249b0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
249c0 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
249d0 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
249e0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
249f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
24a00 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
24a10 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
24a20 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
24a30 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
24a40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24a50 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
24a60 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
24a70 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
24a80 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
24a90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
24aa0 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
24ab0 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
24ac0 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
24ad0 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
24ae0 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
24af0 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
24b00 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
24b10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
24b20 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
24b30 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
24b40 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
24b50 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
24b60 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
24b70 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
24b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
24b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24ba0 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  PT;.  }..  pCur-
24bb0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
24bc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24bd0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
24be0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
24bf0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
24c00 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
24c10 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20  idOvfl);..  if( 
24c20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
24c30 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
24c40 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
24c50 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
24c60 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
24c70 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
24c80 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
24c90 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
24ca0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24cb0 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
24cc0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
24cd0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
24ce0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24cf0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
24d00 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
24d10 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24d20 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
24d30 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
24d40 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24d50 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24d60 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
24d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
24d80 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
24d90 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
24da0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
24db0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
24dc0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
24dd0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
24de0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
24df0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
24e00 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
24e10 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
24e20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
24e30 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
24e40 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24e50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
24e60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24e70 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
24e80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24e90 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
24ea0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
24eb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24ec0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24ed0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24ee0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24ef0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
24f00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
24f10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24f20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24f30 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
24f40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24f50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24f60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24f70 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24f80 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24f90 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
24fa0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
24fb0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24fc0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24fd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
24ff0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
25000 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
25010 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
25020 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
25030 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
25040 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25050 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
25060 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
25070 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
25080 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
25090 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
250a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
250b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
250c0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
250d0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
250e0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
250f0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
25100 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
25110 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
25120 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
25130 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
25140 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
25150 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
25160 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
25170 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
25180 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
25190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
251a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
251b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
251c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
251d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
251e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
251f0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
25200 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25210 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25220 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25230 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25240 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
25250 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
25260 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25270 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25280 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
25290 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
252a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
252b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
252c0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
252d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
252e0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
252f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
25300 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
25310 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
25320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25330 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25340 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
25350 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
25360 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25370 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
25380 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
25390 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
253a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
253b0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
253c0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
253d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
253e0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
253f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
25400 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
25410 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
25420 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
25430 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
25440 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
25450 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
25460 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
25470 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25480 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
25490 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
254a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
254b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
254c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
254d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
254e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
254f0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25500 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
25510 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
25520 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25540 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
25550 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
25560 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25570 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
25580 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
25590 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
255a0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
255b0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
255c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
255d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
255e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
255f0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
25600 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25610 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
25620 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
25630 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
25650 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
25660 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25670 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
25680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
25690 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
256a0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
256b0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
256c0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
256d0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
256e0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
256f0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25700 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
25710 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
25720 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
25730 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
25740 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
25750 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25760 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25770 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25780 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
25790 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
257a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
257b0 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
257c0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
257d0 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
257e0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
257f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
25800 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28  Cur->eState && (
25810 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25820 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
25830 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
25840 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
25850 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
25860 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
25870 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
25880 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
25890 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
258a0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
258b0 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
258c0 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
258d0 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
258e0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
258f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25900 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
25910 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
25920 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
25930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
25940 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25950 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
25960 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25970 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
25980 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
25990 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
259a0 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
259b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
259c0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
259d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
259e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
259f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25a00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
25a10 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
25a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25a30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25a40 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25a50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25a60 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
25a70 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
25a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25a90 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25aa0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25ab0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25ac0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
25ad0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
25ae0 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Cur);.      if( 
25af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25b00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
25b10 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
25b20 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65  AtLast;.      }e
25b30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75  lse{.        pCu
25b40 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
25b50 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
25b60 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20     }.   .    }. 
25b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25b80 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
25b90 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
25ba0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
25bb0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
25bc0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
25bd0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
25be0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
25bf0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
25c00 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
25c10 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
25c20 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
25c30 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
25c40 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
25c50 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
25c60 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
25c70 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
25c80 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
25c90 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
25ca0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
25cb0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
25cc0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
25cd0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25ce0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
25cf0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
25d00 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
25d10 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
25d20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
25d30 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
25d40 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
25d50 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
25d60 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
25d70 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
25d80 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
25d90 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
25da0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
25db0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
25dc0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
25dd0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
25de0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
25df0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
25e00 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
25e10 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
25e20 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
25e30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
25e40 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
25e50 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25e60 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25e70 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25e80 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
25e90 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
25ea0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
25eb0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25ec0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
25ed0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
25ee0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
25ef0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
25f00 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
25f10 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
25f20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25f30 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25f40 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
25f70 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
25f80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
25f90 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
25fa0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
25fb0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
25fc0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
25fd0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
25fe0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25ff0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
26000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
26010 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
26020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
26030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26040 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
26050 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
26060 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
26070 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
26080 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
26090 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
260a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
260b0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
260c0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
260d0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
260e0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
260f0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
26100 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26120 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
26130 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
26140 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
26150 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
26160 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
26170 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26180 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
261a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
261b0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
261c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
261d0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
261e0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
261f0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
26200 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
26210 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
26220 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
26230 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
26240 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
26250 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
26260 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
26270 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
26280 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
26290 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
262a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
262b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
262c0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
262d0 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
262e0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
262f0 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
26300 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
26310 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
26320 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26340 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
26350 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
26360 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
26370 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  !=0 && pCur->inf
26380 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
26390 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
263a0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
263b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
263c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
263d0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
263e0 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
263f0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
26400 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
26410 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72   pIdxKey->isCorr
26420 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  upt = 0;.    ass
26430 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
26440 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
26450 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
26460 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
26470 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
26480 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
26490 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
264a0 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
264b0 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
264c0 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
264d0 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
264e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
264f0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
26500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
26510 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
26520 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
26530 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
26540 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
26550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26560 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
26570 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26580 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
26590 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
265a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
265b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
265c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
265d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
265e0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
265f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26600 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
26610 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
26620 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
26630 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
26640 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26650 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
26660 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
26670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
26680 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
26690 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
266a0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
266b0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
266c0 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
266d0 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
266e0 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
266f0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
26700 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26710 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
26720 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
26730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26740 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
26750 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
26760 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
26770 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
26780 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
26790 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
267a0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
267b0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
267c0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
267d0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
267e0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
267f0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
26800 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
26810 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
26820 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
26830 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
26840 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
26850 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
26860 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
26870 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
26880 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
26890 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
268a0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
268b0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
268c0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
268d0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
268e0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
268f0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
26900 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
26910 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
26920 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
26930 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
26940 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
26950 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
26960 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
26970 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
26980 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
26990 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
269a0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
269b0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
269c0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
269d0 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
269e0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
269f0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
26a00 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
26a10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
26a20 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
26a30 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
26a40 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
26a50 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
26a60 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
26a70 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
26a80 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
26a90 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
26aa0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
26ab0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
26ac0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
26ad0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
26ae0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
26af0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
26b00 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
26b10 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
26b20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26b30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
26b50 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
26b60 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
26b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26b80 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
26b90 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
26ba0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
26bb0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
26bc0 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
26bd0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
26be0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
26bf0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
26c00 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
26c10 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
26c20 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
26c30 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
26c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26c50 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
26c60 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
26c70 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
26c80 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
26c90 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
26ca0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
26cb0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
26cc0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
26cd0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26ce0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
26cf0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
26d00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26d10 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
26d20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
26d30 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
26d40 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
26d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26d60 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26d70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26d90 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
26da0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
26db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26dc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26dd0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
26de0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
26df0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
26e00 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
26e10 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
26e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
26e30 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
26e40 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20  nt nCell;.      
26e50 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
26e60 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
26e70 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
26e80 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Size;..        /
26e90 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
26ea0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
26eb0 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
26ec0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
26ed0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
26ee0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
26ef0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
26f00 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
26f10 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
26f20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
26f30 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
26f40 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
26f50 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
26f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
26f70 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
26f80 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
26f90 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
26fa0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
26fb0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
26fc0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
26fd0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
26fe0 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
26ff0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
27000 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
27010 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
27020 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
27030 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
27040 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
27050 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
27060 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27070 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
27080 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
27090 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
270a0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
270b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
270c0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
270d0 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
270e0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
270f0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
27100 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
27110 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
27120 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
27130 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
27140 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
27150 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
27160 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
27170 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
27180 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
27190 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
271a0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
271b0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
271c0 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
271d0 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
271e0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
271f0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
27200 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
27210 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
27220 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
27230 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
27240 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
27250 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27260 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
27270 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
27280 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
27290 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
272a0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
272b0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
272c0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
272d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
272e0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
272f0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
27310 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
27320 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
27330 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
27340 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
27350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
27360 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
27370 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
27380 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
27390 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
273a0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
273b0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
273c0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
273d0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
273e0 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
273f0 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
27400 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
27410 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
27420 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
27430 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
27440 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
27450 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
27460 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
27470 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
27480 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
27490 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
274a0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
274b0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
274c0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
274d0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
274e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
274f0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
27500 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
27510 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
27520 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
27530 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
27540 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
27550 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
27560 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
27570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27590 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
275a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
275b0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
275c0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
275d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
275e0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
275f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
27600 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
27610 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
27620 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
27630 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
27640 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27650 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27660 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
27670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
27680 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
27690 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
276a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
276b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
276c0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
276d0 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  xKey, 0);.      
276e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
276f0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
27700 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
27710 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 69  sert( pIdxKey->i
27720 73 43 6f 72 72 75 70 74 3d 3d 30 20 7c 7c 20 63  sCorrupt==0 || c
27730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
27740 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
27750 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
27760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
27770 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
27780 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
27790 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
277a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
277b0 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
277c0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
277d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
277e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
277f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27800 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27810 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
27820 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 69    if( pIdxKey->i
27830 73 43 6f 72 72 75 70 74 20 29 20 72 63 20 3d 20  sCorrupt ) rc = 
27840 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
27850 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
27860 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
27870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27880 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
27890 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
278a0 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
278b0 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
278c0 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
278d0 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
278e0 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
278f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
27900 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
27910 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
27920 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
27930 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27940 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
27950 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
27960 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
27970 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27980 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27990 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
279a0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
279b0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
279c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
279d0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
279e0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
279f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27a00 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
27a10 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
27a20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
27a30 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
27a40 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
27a50 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
27a60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27a70 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
27a80 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
27a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27aa0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
27ab0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
27ac0 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
27ad0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27ae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27af0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
27b00 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
27b10 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
27b20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
27b30 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
27b40 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
27b50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
27b60 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
27b70 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
27b80 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
27b90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27ba0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
27bb0 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
27bc0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
27bd0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
27be0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
27bf0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
27c00 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
27c10 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
27c20 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
27c30 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
27c40 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27c50 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
27c60 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
27c70 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
27c80 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
27c90 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
27ca0 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
27cb0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
27cc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
27cd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27ce0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
27cf0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
27d00 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
27d10 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
27d20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
27d30 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
27d40 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
27d50 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
27d60 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
27d70 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
27d80 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
27d90 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
27da0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
27db0 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
27dc0 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
27dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
27de0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27df0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
27e00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
27e10 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
27e20 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
27e30 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
27e40 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
27e50 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
27e60 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
27e70 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
27e80 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
27e90 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
27ea0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
27eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
27ec0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
27ed0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
27ee0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
27ef0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
27f00 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
27f10 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
27f20 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
27f30 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
27f40 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
27f50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
27f60 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
27f70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
27f80 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
27f90 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
27fa0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
27fb0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
27fc0 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
27fd0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
27fe0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
27ff0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
28000 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
28010 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
28020 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
28030 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
28040 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
28050 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
28060 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
28070 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
28080 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
28090 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
280a0 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
280b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
280c0 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
280d0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e   however.).*/.in
280e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
280f0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
28100 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
28110 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
28120 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
28130 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
28140 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28150 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28160 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
28170 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
28180 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
28190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
281a0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
281b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
281c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
281d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
281e0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
281f0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
28200 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
28210 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  Cur);.    rc = r
28220 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
28230 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
28240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28250 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  K ){.      *pRes
28260 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
28270 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28280 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
28290 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
282a0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
282b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
282c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
282d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
282e0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
282f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28300 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28310 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
28320 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
28330 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
28340 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28350 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
28360 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
28370 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
28380 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
28390 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
283a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
283b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
283c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
283d0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
283e0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
283f0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
28400 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28410 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
28420 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
28430 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
28440 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
28450 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
28460 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28470 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
28480 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
28490 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
284a0 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
284b0 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
284c0 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
284d0 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
284e0 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
284f0 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
28500 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
28510 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
28520 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
28530 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
28540 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
28550 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
28560 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
28570 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
28580 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
28590 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
285a0 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
285b0 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
285c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
285d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
285e0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
285f0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
28600 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28610 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69  _ValidOvfl);.  i
28620 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
28630 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
28640 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28650 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
28660 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
28670 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
28680 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
28690 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
286a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
286b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
286c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
286d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
286e0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
286f0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
28700 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
28710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28720 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
28730 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
28740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
28750 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
28760 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28770 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
287a0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
287b0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
287c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
287d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
287e0 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
287f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28800 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
28810 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
28820 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
28830 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
28840 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
28850 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
28860 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
28870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
28880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
28890 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
288a0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
288b0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
288c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
288d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
288e0 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
288f0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
28900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
28910 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
28920 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
28930 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
28940 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
28950 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
28960 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
28970 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
28980 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
28990 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
289a0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
289b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
289c0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
289d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
289e0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
289f0 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
28a00 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
28a10 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
28a20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
28a30 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
28a40 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
28a50 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
28a60 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
28a70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
28a80 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
28a90 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
28aa0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
28ab0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
28ac0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
28ad0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
28ae0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
28af0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
28b00 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
28b10 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
28b20 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
28b30 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
28b40 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
28b50 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
28b60 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
28b70 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
28b80 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
28b90 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
28ba0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
28bb0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
28bc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
28bd0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
28be0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
28bf0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
28c00 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
28c10 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
28c20 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  er.).*/.int sqli
28c30 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
28c40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28c50 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
28c60 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
28c70 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
28c80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28c90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28ca0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
28cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
28cc0 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
28cd0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
28ce0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
28cf0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
28d00 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
28d10 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
28d20 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
28d30 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
28d40 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  fl);.  if( pCur-
28d50 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
28d60 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 69 66 28  VALID ){.    if(
28d70 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
28d80 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
28d90 55 49 52 45 53 45 45 4b 29 20 29 7b 0a 20 20 20  UIRESEEK) ){.   
28da0 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73     rc = btreeRes
28db0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
28dc0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  on(pCur);.      
28dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28de0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  K ){.        *pR
28df0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
28e00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28e10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
28e20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
28e30 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
28e40 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
28e50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28e60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
28e70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
28e80 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
28e90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28ea0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28eb0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
28ec0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
28ed0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
28ee0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
28ef0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
28f00 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
28f10 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
28f20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
28f30 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   0;.        *pRe
28f40 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
28f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
28f70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
28f80 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
28f90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28fa0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28fb0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
28fc0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
28fd0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28fe0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
28ff0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
29000 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
29010 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29020 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
29030 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
29040 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
29050 72 63 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  rc ){.      *pRe
29060 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
29070 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29080 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
29090 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
290a0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
290b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
290c0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
290d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
290e0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
290f0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
29100 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
29110 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
29120 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
29130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
29150 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
29160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
29170 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
29180 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
29190 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
291a0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
291b0 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 20 20  alidOvfl);..    
291c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
291d0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
291e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
291f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29200 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
29210 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
29220 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
29230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29240 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
29250 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
29260 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
29270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
29280 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
29290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
292a0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
292b0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
292c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
292d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
292e0 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
292f0 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
29300 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
29310 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
29320 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
29330 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
29340 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
29350 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
29360 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
29370 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
29380 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
29390 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
293a0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
293b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
293c0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
293d0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
293e0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
293f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
29400 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
29410 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
29420 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
29430 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
29440 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
29450 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
29460 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
29470 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
29480 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
29490 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
294a0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
294b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
294c0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
294d0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
294e0 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
294f0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
29500 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
29510 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
29520 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
29530 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
29540 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
29550 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
29560 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
29570 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
29580 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
29590 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
295a0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
295b0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
295c0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
295d0 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
295e0 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
295f0 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
29600 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
29610 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
29620 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
29630 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
29640 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
29650 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
29660 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
29670 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
29680 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
29690 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
296a0 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
296b0 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
296c0 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
296d0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
296e0 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
296f0 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
29700 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
29710 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
29720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29730 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
29740 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
29750 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
29760 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
29770 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
29780 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
29790 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
297a0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
297b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
297c0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
297d0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
297e0 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
297f0 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
29800 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
29810 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
29820 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
29830 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
29840 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
29850 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
29860 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
29870 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
29880 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
29890 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
298a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
298b0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
298c0 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
298d0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
298e0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
298f0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
29900 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
29910 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
29920 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
29930 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
29940 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
29950 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
29960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29970 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
29980 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29990 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
299a0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
299b0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
299c0 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
299d0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
299e0 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
299f0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
29a00 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
29a10 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
29a20 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
29a30 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29a40 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
29a50 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
29a60 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
29a70 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
29a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29a90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
29aa0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
29ab0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
29ac0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
29ad0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
29ae0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
29af0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
29b00 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
29b10 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
29b20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
29b30 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
29b40 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
29b50 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
29b60 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
29b70 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
29b80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29b90 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
29ba0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
29bb0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
29bc0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
29bd0 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
29be0 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
29bf0 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
29c00 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
29c10 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
29c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
29c30 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
29c40 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
29c50 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
29c60 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
29c70 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
29c80 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
29c90 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
29ca0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29cb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
29cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
29cd0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
29ce0 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
29cf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29d00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29d10 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
29d20 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
29d30 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
29d40 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
29d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29d60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
29d70 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
29d80 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
29d90 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
29da0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
29db0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
29dc0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
29dd0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
29de0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
29df0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
29e00 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
29e10 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
29e20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
29e30 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
29e40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29e50 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
29e60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
29e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29e80 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
29e90 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
29ea0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
29eb0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
29ec0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
29ed0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
29ee0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
29ef0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
29f00 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
29f10 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
29f20 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
29f30 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
29f40 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
29f50 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
29f60 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
29f70 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
29f80 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
29f90 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
29fa0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
29fb0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
29fc0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
29fd0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
29fe0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
29ff0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2a000 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2a010 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2a020 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2a030 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2a040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2a050 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2a060 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2a070 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2a080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2a090 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2a0a0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2a0b0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2a0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a0d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a0e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
2a0f0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2a100 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2a110 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2a120 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
2a130 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2a140 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2a150 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
2a160 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2a170 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2a180 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
2a190 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2a1a0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
2a1b0 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b  a!=0 );..      k
2a1c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2a1d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20  unk->aData[4]); 
2a1e0 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f  /* # of leaves o
2a1f0 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  n this trunk pag
2a200 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b  e */.      if( k
2a210 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2a220 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2a230 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2a240 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2a250 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2a260 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2a270 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2a280 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2a290 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2a2a0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2a2b0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2a2c0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2a2d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a2e0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2a2f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a300 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a310 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2a320 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a340 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a350 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2a360 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2a370 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2a380 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2a390 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2a3a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2a3b0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2a3c0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2a3d0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2a3e0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2a3f0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2a400 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2a410 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2a420 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2a430 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2a440 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2a450 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2a460 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2a470 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2a480 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2a490 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2a4a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a4b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a4c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a4d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2a4e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a4f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2a500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2a510 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2a520 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2a530 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2a540 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2a550 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2a560 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2a570 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2a580 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2a590 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2a5a0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2a5b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2a5c0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2a5d0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2a5e0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2a5f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a600 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2a610 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2a620 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2a630 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2a640 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2a650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a660 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2a670 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2a680 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2a690 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a6a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a6b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2a6c0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2a6d0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2a6e0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2a6f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2a700 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2a710 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2a720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2a730 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2a740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a750 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2a760 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2a770 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a790 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2a7a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a7b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2a7c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2a7d0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2a7e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2a7f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2a800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2a810 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2a830 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2a840 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2a850 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2a860 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2a870 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2a880 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2a890 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2a8a0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2a8b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2a8c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2a8d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2a8e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2a8f0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2a900 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2a910 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2a920 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2a930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a940 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2a950 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2a960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2a970 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a980 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a990 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a9a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a9b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2a9c0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
2a9d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
2a9e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a9f0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2aa00 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2aa10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2aa20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2aa30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2aa40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2aa50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2aa60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2aa70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2aa80 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2aa90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2aaa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2aab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aac0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2aad0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2aae0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2aaf0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2ab00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ab10 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2ab20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2ab30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2ab40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2ab50 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2ab60 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2ab70 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2ab80 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2ab90 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2aba0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2abb0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2abc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2abd0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2abe0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2abf0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2ac00 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2ac10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ac20 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2ac30 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2ac40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2ac50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2ac60 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2ac70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ac80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ac90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2aca0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2acb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2acc0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ace0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2acf0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2ad00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2ad10 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2ad20 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2ad30 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2ad40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ad50 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2ad60 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2ad70 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2ad80 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2ad90 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2ada0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2adb0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2adc0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2add0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2ade0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2adf0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2ae00 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2ae10 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2ae20 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2ae30 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2ae40 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2ae50 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2ae60 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2ae70 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2ae80 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2ae90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2aea0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2aeb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2aec0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2aed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2aee0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2aef0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2af00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2af10 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2af20 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2af30 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2af40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2af50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2af60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2af70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2af80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2af90 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2afa0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2afb0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2afc0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2afd0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2aff0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2b010 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2b020 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2b030 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2b040 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2b050 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2b060 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2b070 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2b080 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2b090 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2b0b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b0c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b0e0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2b0f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b100 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2b110 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2b120 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2b130 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2b140 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2b150 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2b160 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2b170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2b180 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b190 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b1a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b1c0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2b1d0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2b1e0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2b1f0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2b200 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2b210 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2b220 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2b230 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2b240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2b250 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2b260 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2b270 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2b280 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2b290 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2b2a0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2b2b0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2b2c0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2b2d0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2b300 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2b310 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2b320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b330 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2b340 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2b350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b360 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2b370 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2b380 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2b390 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2b3a0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2b3b0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2b3c0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2b3d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b3e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2b3f0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2b400 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2b410 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2b420 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2b430 2a 70 50 67 6e 6f 29 20 3f 20 50 41 47 45 52 5f  *pPgno) ? PAGER_
2b440 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
2b450 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2b460 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2b470 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
2b480 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
2b490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b4a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b4b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b4c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b4d0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2b4e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b4f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b510 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b520 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2b530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b550 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2b560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b570 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
2b580 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
2b590 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2b5a0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
2b5b0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
2b5c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2b5d0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
2b5e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2b5f0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
2b600 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2b610 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2b620 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
2b630 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
2b640 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
2b650 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
2b660 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
2b670 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
2b680 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
2b690 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
2b6a0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
2b6b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
2b6c0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
2b6d0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
2b6e0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
2b6f0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
2b700 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
2b710 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
2b720 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
2b730 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
2b740 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
2b750 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
2b760 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
2b770 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
2b780 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
2b790 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
2b7a0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
2b7b0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
2b7c0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
2b7d0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
2b7e0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
2b7f0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
2b800 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
2b810 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
2b820 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
2b830 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
2b840 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
2b850 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
2b860 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
2b870 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
2b880 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
2b890 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
2b8a0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
2b8b0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
2b8c0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
2b8d0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
2b8e0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
2b8f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2b900 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2b910 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
2b920 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
2b930 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
2b940 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
2b950 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
2b960 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
2b970 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
2b980 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
2b990 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
2b9a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2b9b0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
2b9c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2b9d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2b9e0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
2b9f0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
2ba00 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
2ba10 61 74 65 29 29 20 3f 20 50 41 47 45 52 5f 47 45  ate)) ? PAGER_GE
2ba20 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b  T_NOCONTENT : 0;
2ba30 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2ba40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2ba50 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2ba60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2ba70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ba80 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2ba90 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
2baa0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2bab0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
2bac0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
2bad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2bae0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2baf0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2bb00 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
2bb10 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
2bb20 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
2bb30 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
2bb40 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
2bb50 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
2bb60 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
2bb70 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
2bb80 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
2bb90 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
2bba0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
2bbb0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
2bbc0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
2bbd0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2bbe0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
2bbf0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2bc00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2bc10 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
2bc20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
2bc30 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2bc40 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
2bc50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2bc60 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
2bc70 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2bc80 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
2bc90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2bca0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
2bcb0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2bcc0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
2bcd0 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
2bce0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2bcf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bd00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2bd10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2bd20 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
2bd30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bd40 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
2bd50 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2bd60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
2bd70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2bd80 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2bd90 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2bda0 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
2bdb0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
2bdc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
2bdd0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
2bde0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
2bdf0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
2be00 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
2be10 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2be20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2be30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2be40 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2be50 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2be60 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2be70 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
2be80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2be90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2bea0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2beb0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2bec0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2bed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bee0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2bef0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2bf00 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
2bf10 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2bf20 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
2bf30 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
2bf40 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
2bf50 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2bf60 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
2bf70 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2bf80 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2bf90 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
2bfa0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2bfb0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2bfc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2bfd0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
2bfe0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
2bff0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
2c000 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
2c010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2c020 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
2c030 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2c040 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c050 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2c060 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
2c070 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
2c080 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2c090 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
2c0a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2c0b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c0c0 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
2c0d0 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
2c0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c0f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c100 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
2c110 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
2c120 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c130 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
2c140 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2c150 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2c160 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
2c170 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
2c180 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
2c190 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2c1a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2c1b0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2c1c0 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
2c1d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
2c1e0 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
2c1f0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
2c200 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2c210 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
2c220 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
2c230 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
2c240 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
2c250 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
2c260 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
2c270 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
2c280 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
2c290 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
2c2a0 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
2c2b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2c2c0 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
2c2d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
2c2e0 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
2c2f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2c300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
2c310 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
2c320 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
2c330 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
2c340 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2c350 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2c360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2c370 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2c380 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
2c390 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3b0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
2c3c0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2c3d0 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
2c3e0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2c3f0 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
2c400 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
2c410 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2c420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
2c450 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
2c460 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
2c470 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c490 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2c4a0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2c4d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2c4e0 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
2c4f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2c500 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c510 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c520 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
2c530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
2c540 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
2c550 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
2c560 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
2c570 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2c580 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2c590 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2c5a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2c5b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2c5c0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2c5d0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2c5e0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2c5f0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2c600 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2c610 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2c620 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c630 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2c640 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2c650 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2c660 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2c670 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2c680 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2c690 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2c6a0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2c6b0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2c6c0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2c6d0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2c6e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2c6f0 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2c700 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2c710 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2c720 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2c730 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2c740 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2c750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c760 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2c770 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2c780 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2c790 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
2c7a0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
2c7b0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
2c7c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2c7d0 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
2c7e0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
2c7f0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c800 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2c810 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
2c820 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
2c830 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2c840 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2c850 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2c860 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2c870 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2c880 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2c890 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2c8a0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2c8b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2c8c0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2c8d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2c8e0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2c8f0 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2c900 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c910 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c920 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2c930 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2c940 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2c950 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2c960 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2c970 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2c980 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2c990 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2c9a0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2c9b0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2c9c0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2c9d0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2c9e0 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2c9f0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2ca00 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2ca10 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2ca20 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2ca30 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2ca40 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2ca50 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2ca60 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2ca70 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2ca80 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2ca90 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2caa0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2cab0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2cac0 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2cad0 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2cae0 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb00 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2cb10 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2cb20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2cb30 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2cb40 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2cb50 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2cb60 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2cb70 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2cb80 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2cb90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cba0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2cbb0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2cbc0 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2cbd0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2cbe0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2cbf0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2cc00 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2cc10 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2cc20 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2cc30 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2cc40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2cc50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2cc60 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2cc70 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2cc80 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2cc90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2cca0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2ccb0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2ccc0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2ccd0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2cce0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2ccf0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2cd00 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2cd10 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2cd20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2cd30 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2cd40 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2cd50 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2cd60 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2cd70 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2cd80 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2cd90 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2cda0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2cdb0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2cdc0 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2cdd0 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2cde0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2cdf0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2ce00 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2ce10 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2ce20 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2ce30 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2ce40 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2ce50 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2ce60 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2ce70 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2ce80 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2ce90 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2cea0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2ceb0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2cec0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2ced0 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2cee0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2cef0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2cf00 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2cf10 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2cf20 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2cf30 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2cf40 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2cf50 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2cf60 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2cf70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2cf80 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2cf90 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2cfa0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2cfb0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2cfc0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2cfd0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2cfe0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2cff0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2d000 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2d010 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d020 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2d030 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2d040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d050 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2d060 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2d070 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
2d080 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2d090 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
2d0a0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
2d0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2d0c0 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
2d0d0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2d0e0 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
2d0f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d100 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2d110 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2d120 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d130 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2d140 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2d150 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2d160 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2d170 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2d180 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2d190 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2d1a0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2d1b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2d1c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2d1d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2d1e0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2d1f0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2d200 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2d210 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2d220 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2d230 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2d240 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2d250 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2d260 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2d270 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2d280 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2d290 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2d2a0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2d2b0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2d2c0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2d2d0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2d2e0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2d2f0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2d300 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2d310 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2d320 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2d330 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2d340 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2d350 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2d360 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d370 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2d380 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2d390 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d3a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2d3b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d3c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2d3d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2d3f0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2d400 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2d410 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2d420 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2d430 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2d440 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2d450 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2d460 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2d470 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2d480 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2d490 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2d4a0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2d4b0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2d4c0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2d4d0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2d4e0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2d4f0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2d500 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2d510 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2d520 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d530 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2d540 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2d550 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2d560 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2d570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2d580 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2d590 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2d5a0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2d5b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2d5c0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2d5d0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2d5e0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2d5f0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2d600 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2d610 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2d620 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2d630 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2d640 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2d650 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2d660 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2d670 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2d680 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2d690 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2d6a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d6b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2d6c0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2d6d0 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2d6e0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2d6f0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2d700 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2d710 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2d720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2d730 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2d740 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2d750 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2d760 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2d770 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
2d780 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
2d790 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
2d7a0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
2d7b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d7c0 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65  UPT_BKPT;  /* Ce
2d7d0 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ll extends past 
2d7e0 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20  end of page */. 
2d7f0 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
2d800 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
2d810 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
2d820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
2d830 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
2d840 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
2d850 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
2d860 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
2d870 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
2d880 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
2d890 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
2d8a0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
2d8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
2d8c0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
2d8d0 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
2d8e0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
2d8f0 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
2d900 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
2d910 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
2d920 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
2d930 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
2d940 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
2d950 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
2d960 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
2d970 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
2d980 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
2d990 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2d9a0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
2d9b0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
2d9c0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2d9d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
2d9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
2d9f0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
2da00 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
2da10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2da20 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
2da30 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
2da40 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
2da50 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
2da60 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
2da70 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
2da80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2da90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
2daa0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
2dab0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
2dac0 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
2dad0 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
2dae0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
2daf0 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
2db00 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
2db10 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
2db20 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
2db30 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
2db40 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
2db50 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
2db60 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
2db70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
2db80 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
2db90 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
2dba0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
2dbb0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
2dbc0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
2dbd0 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
2dbe0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
2dbf0 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
2dc00 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
2dc10 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
2dc20 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
2dc30 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2dc40 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
2dc50 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
2dc60 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
2dc70 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
2dc80 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
2dc90 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
2dca0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
2dcb0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
2dcc0 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
2dcd0 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
2dce0 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
2dcf0 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
2dd00 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
2dd10 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
2dd20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
2dd30 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
2dd40 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
2dd50 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
2dd60 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
2dd70 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
2dd80 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
2dd90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dda0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ddb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ddc0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
2ddd0 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
2dde0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
2ddf0 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
2de00 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2de10 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
2de20 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
2de30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2de40 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
2de50 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
2de60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2de70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
2de80 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
2de90 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
2dea0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
2deb0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
2dec0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
2ded0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
2dee0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
2def0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
2df00 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
2df10 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
2df20 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
2df30 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
2df40 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
2df50 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
2df60 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
2df70 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
2df80 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
2df90 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
2dfa0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
2dfb0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
2dfc0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
2dfd0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
2dfe0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
2dff0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
2e000 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
2e010 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
2e020 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
2e030 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
2e040 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
2e050 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
2e060 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2e070 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
2e080 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
2e090 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2e0a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2e0b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
2e0c0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2e0d0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
2e0e0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
2e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
2e100 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
2e110 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
2e120 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2e130 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2e140 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
2e150 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
2e160 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
2e170 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
2e180 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
2e190 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2e1a0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
2e1b0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
2e1c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
2e1f0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
2e200 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
2e210 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
2e220 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
2e230 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
2e240 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
2e250 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
2e260 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
2e270 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
2e280 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
2e290 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2e2a0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
2e2b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e2c0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
2e2d0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
2e2e0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
2e2f0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2e300 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e310 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2e320 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2e330 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
2e340 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
2e350 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
2e360 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
2e370 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
2e380 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
2e390 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
2e3a0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
2e3b0 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
2e3c0 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
2e3d0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
2e3e0 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
2e3f0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2e410 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e420 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e430 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2e440 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
2e450 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
2e460 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
2e470 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e480 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
2e490 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2e4a0 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
2e4b0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2e4c0 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
2e4d0 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
2e4e0 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
2e4f0 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
2e500 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
2e510 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
2e520 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2e530 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
2e540 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2e550 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2e560 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
2e570 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
2e580 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
2e590 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
2e5a0 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
2e5b0 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
2e5c0 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
2e5d0 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
2e5e0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2e5f0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
2e600 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
2e610 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
2e620 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
2e630 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
2e640 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
2e650 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
2e660 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
2e670 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
2e680 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
2e690 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2e6a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e6b0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
2e6c0 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
2e6d0 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
2e6e0 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
2e6f0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
2e700 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
2e710 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
2e720 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
2e730 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
2e740 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
2e750 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
2e760 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2e770 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
2e780 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
2e790 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
2e7a0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2e7b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2e7c0 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
2e7d0 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
2e7e0 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
2e7f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
2e800 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
2e810 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2e820 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2e830 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
2e840 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
2e850 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
2e860 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
2e870 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
2e880 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
2e890 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
2e8a0 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
2e8b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2e8c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
2e8d0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2e8e0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
2e8f0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
2e900 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
2e910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2e920 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
2e930 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2e940 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2e950 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
2e960 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
2e970 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
2e980 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
2e990 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
2e9a0 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
2e9b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2e9c0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
2e9d0 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
2e9e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2e9f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2ea00 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
2ea10 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
2ea20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
2ea30 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
2ea40 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
2ea50 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
2ea60 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
2ea70 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
2ea80 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
2ea90 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
2eaa0 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
2eab0 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
2eac0 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
2ead0 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
2eae0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75  initialized valu
2eaf0 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
2eb00 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
2eb10 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
2eb20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
2eb30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
2eb40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2eb50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2eb60 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2eb70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
2eb80 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
2eb90 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
2eba0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
2ebb0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
2ebc0 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
2ebd0 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
2ebe0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ebf0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2ec00 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
2ec10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ec20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2ec30 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
2ec40 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2ec50 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
2ec60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ec70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2ec80 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2ec90 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
2eca0 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
2ecb0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2ecc0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2ecd0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2ece0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2ecf0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2ed00 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2ed10 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2ed20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ed30 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2ed40 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2ed50 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
2ed60 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
2ed70 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2ed80 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2ed90 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2eda0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
2edb0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
2edc0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
2edd0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2ede0 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
2edf0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2ee00 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2ee10 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2ee20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ee30 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ee40 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2ee50 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
2ee60 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2ee70 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2ee80 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
2ee90 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
2eea0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
2eeb0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
2eec0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2eed0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
2eee0 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
2eef0 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
2ef00 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
2ef10 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
2ef20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
2ef30 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
2ef40 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
2ef50 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
2ef60 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2ef70 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2ef80 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
2ef90 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2efa0 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
2efb0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2efc0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2efd0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2efe0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
2eff0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2f000 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2f010 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2f020 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2f030 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
2f040 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
2f050 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2f060 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2f070 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2f080 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
2f090 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2f0a0 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
2f0b0 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
2f0c0 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
2f0d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2f0e0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2f0f0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2f100 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f110 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2f120 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
2f130 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
2f140 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
2f150 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
2f160 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
2f170 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
2f180 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
2f190 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
2f1a0 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
2f1b0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
2f1c0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
2f1d0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
2f1e0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
2f1f0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
2f200 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
2f210 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
2f220 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
2f230 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
2f240 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
2f250 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
2f260 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2f270 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f280 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2f290 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
2f2a0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
2f2b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
2f2c0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
2f2d0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
2f2e0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
2f2f0 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
2f300 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
2f310 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
2f320 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
2f330 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
2f340 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
2f350 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
2f360 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
2f370 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
2f380 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
2f390 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
2f3a0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2f3b0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
2f3c0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2f3d0 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
2f3e0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2f3f0 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
2f400 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
2f410 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2f420 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
2f430 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
2f440 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
2f450 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
2f460 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
2f470 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
2f480 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
2f490 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
2f4a0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
2f4b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2f4c0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2f4d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
2f4e0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
2f4f0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
2f500 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
2f510 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
2f520 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
2f530 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
2f540 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2f550 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2f560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2f570 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
2f580 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
2f590 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2f5a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2f5b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2f5c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f5d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2f5e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2f5f0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2f600 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
2f610 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2f620 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
2f630 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
2f640 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2f650 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
2f660 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
2f670 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2f680 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2f690 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
2f6a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2f6b0 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32  .  if( pc < (u32
2f6c0 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  )get2byte(&data[
2f6d0 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
2f6e0 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
2f6f0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2f700 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
2f710 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f720 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
2f730 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
2f740 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
2f750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
2f760 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
2f770 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  urn;.  }.  pPage
2f780 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d  ->nCell--;.  mem
2f790 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c  move(ptr, ptr+2,
2f7a0 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   2*(pPage->nCell
2f7b0 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75 74 32   - idx));.  put2
2f7c0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2f7d0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2f7e0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2f7f0 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   += 2;.}../*.** 
2f800 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
2f810 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
2f820 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
2f830 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
2f840 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
2f850 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
2f860 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
2f870 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
2f880 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
2f890 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
2f8a0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
2f8b0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
2f8c0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
2f8d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
2f8e0 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
2f8f0 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
2f900 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
2f910 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
2f920 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
2f930 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
2f940 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
2f950 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
2f960 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
2f970 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
2f980 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
2f990 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
2f9a0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
2f9b0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
2f9c0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
2f9d0 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
2f9e0 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
2f9f0 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
2fa00 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
2fa10 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
2fa20 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
2fa30 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
2fa40 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
2fa50 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
2fa60 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
2fa70 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
2fa80 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2fa90 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
2faa0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2fab0 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
2fac0 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
2fad0 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
2fae0 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
2faf0 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
2fb00 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
2fb10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fb20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
2fb30 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2fb40 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
2fb50 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
2fb60 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
2fb70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2fb80 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
2fb90 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
2fba0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2fbb0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
2fbc0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2fbd0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
2fbe0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
2fbf0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
2fc00 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
2fc10 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
2fc20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
2fc30 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
2fc40 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
2fc50 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
2fc60 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
2fc70 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
2fc80 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
2fc90 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
2fca0 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
2fcb0 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
2fcc0 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
2fcd0 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
2fce0 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
2fcf0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
2fd00 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
2fd10 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
2fd20 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
2fd30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2fd40 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2fd50 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
2fd60 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
2fd70 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
2fd80 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2fd90 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
2fda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2fdb0 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
2fdc0 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
2fdd0 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
2fde0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
2fdf0 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
2fe00 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
2fe10 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2fe20 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
2fe30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fe40 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
2fe50 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 69  hole page */.  i
2fe60 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
2fe70 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
2fe80 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2fe90 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
2fea0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
2feb0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
2fec0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
2fed0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2fee0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2fef0 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2ff00 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2ff10 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
2ff20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ff30 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
2ff40 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
2ff50 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2ff60 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2ff70 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
2ff80 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
2ff90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ffa0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ffb0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ffc0 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2ffd0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2ffe0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2fff0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
30000 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
30010 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
30020 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
30030 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
30040 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
30050 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
30060 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
30070 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
30080 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
30090 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
300a0 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
300b0 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
300c0 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
300d0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
300e0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
300f0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
30100 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
30110 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
30120 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
30130 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
30140 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
30150 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
30160 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
30170 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
30180 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
30190 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
301a0 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
301b0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
301c0 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
301d0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
301e0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
301f0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
30200 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
30210 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
30220 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
30230 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
30240 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
30250 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
30260 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
30270 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
30280 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20  ge->apOvfl[0])) 
30290 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70  );.    pPage->ap
302a0 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b  Ovfl[j] = pCell;
302b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76  .    pPage->aiOv
302c0 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a  fl[j] = (u16)i;.
302d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
302e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
302f0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
30300 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
30310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30320 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
30330 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
30340 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
30350 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30360 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30370 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30380 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
30390 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
303a0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
303b0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
303c0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
303d0 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
303e0 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
303f0 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
30400 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
30410 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
30420 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
30430 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
30440 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
30450 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
30460 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
30470 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
30480 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
30490 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
304a0 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
304b0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
304c0 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
304d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
304e0 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
304f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
30500 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
30510 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
30520 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
30530 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
30540 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
30550 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
30560 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
30570 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
30580 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
30590 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
305a0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
305b0 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
305c0 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e  ins+2], &data[in
305d0 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20  s], end-ins);.  
305e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
305f0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
30600 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
30610 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
30620 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
30630 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
30640 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30650 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
30660 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
30670 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
30680 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
30690 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
306a0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
306b0 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
306c0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
306d0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
306e0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
306f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
30700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
30710 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
30720 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
30730 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
30750 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
30760 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
30770 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
30780 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
30790 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
307a0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
307b0 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
307c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
307d0 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
307e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
307f0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
30800 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
30810 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
30820 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
30830 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
30840 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
30850 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
30860 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
30870 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
30880 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
30890 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
308a0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
308b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
308c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
308d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
308e0 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
308f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
30900 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
30910 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
30920 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
30930 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
30940 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
30950 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
30960 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
30970 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
30980 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
30990 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
309a0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
309b0 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
309c0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
309d0 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
309e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
309f0 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
30a00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
30a10 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
30a20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
30a30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
30a40 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
30a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30a60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
30a70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
30a80 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
30a90 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
30aa0 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
30ab0 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
30ac0 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
30ad0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
30ae0 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
30af0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
30b00 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
30b10 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
30b20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
30b30 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
30b40 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
30b50 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
30b60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
30b70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
30b80 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
30b90 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
30ba0 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
30bb0 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67  pCellptr = &pPag
30bc0 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  e->aCellIdx[nCel
30bd0 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
30be0 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
30bf0 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
30c00 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36  0; i--){.    u16
30c10 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a   sz = aSize[i];.
30c20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
30c30 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
30c40 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62  -= sz;.    put2b
30c50 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
30c60 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
30c70 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
30c80 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
30c90 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62  sz);.  }.  put2b
30ca0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
30cb0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  , nCell);.  put2
30cc0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
30cd0 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
30ce0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
30cf0 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62  (nCell*2 + nUsab
30d00 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  le - cellbody);.
30d10 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
30d20 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
30d30 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
30d40 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
30d50 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
30d60 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
30d70 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
30d80 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
30d90 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
30da0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
30db0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
30dc0 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
30dd0 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
30de0 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
30df0 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
30e00 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
30e10 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
30e20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
30e30 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
30e40 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
30e50 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
30e60 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
30e70 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
30e80 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
30e90 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
30ea0 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
30eb0 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
30ec0 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
30ed0 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
30ee0 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
30ef0 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
30f00 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
30f10 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
30f20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
30f30 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
30f40 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
30f50 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
30f60 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
30f70 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
30f80 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
30f90 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
30fa0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
30fb0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
30fc0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
30fd0 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
30fe0 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
30ff0 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
31000 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
31010 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
31020 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
31030 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
31040 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
31050 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
31060 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
31070 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
31080 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
31090 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
310a0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
310b0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
310c0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
310d0 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
310e0 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
310f0 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
31100 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
31110 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
31120 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
31130 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74  tead of trying t
31140 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  o balance the 3 
31150 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
31160 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
31170 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
31180 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
31190 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
311a0 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
311b0 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
311c0 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
311d0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
311e0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
311f0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
31200 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
31210 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
31220 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
31230 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
31240 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
31250 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
31260 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
31270 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
31280 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
31290 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
312a0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
312b0 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
312c0 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
312d0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
312e0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
312f0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
31300 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
31310 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
31320 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
31330 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
31340 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
31350 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
31360 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
31370 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
31380 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
31390 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
313a0 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
313b0 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
313c0 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
313d0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
313e0 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
313f0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
31400 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
31410 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
31420 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
31430 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
31440 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
31450 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
31460 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
31470 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
31480 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
31490 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
314a0 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
314b0 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
314c0 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
314d0 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
314e0 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
314f0 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
31500 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
31510 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
31520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31530 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
31540 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31570 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
31580 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
31590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
315b0 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
315c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
315d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
315e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
315f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
31600 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31610 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
31620 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
31630 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
31640 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
31650 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f  /* This error co
31660 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63  ndition is now c
31670 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
31680 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e  eaching this fun
31690 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
316a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
316b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
316c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
316d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
316e0 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
316f0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
31700 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
31710 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
31720 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
31730 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
31740 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
31750 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
31760 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
31770 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
31780 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
31790 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
317a0 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
317b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
317c0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
317d0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
317e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
317f0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
31800 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
31810 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
31820 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
31830 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
31840 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
31850 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
31860 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
31870 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
31880 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31890 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
318a0 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
318b0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
318c0 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
318d0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
318e0 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
318f0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
31900 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
31910 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
31920 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
31930 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
31940 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
31950 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
31960 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
31970 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
31980 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
31990 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
319a0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
319b0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
319c0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
319d0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
319e0 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
319f0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
31a00 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
31a10 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
31a20 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
31a30 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
31a40 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
31a50 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
31a60 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
31a70 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
31a80 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
31a90 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
31aa0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
31ab0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
31ac0 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
31ad0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
31ae0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
31af0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
31b00 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
31b10 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
31b20 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
31b30 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
31b40 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
31b50 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
31b60 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
31b70 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
31b80 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
31b90 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
31ba0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
31bb0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
31bc0 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
31bd0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
31be0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
31bf0 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
31c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31c10 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
31c20 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
31c30 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
31c40 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
31c50 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
31c60 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
31c70 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
31c80 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
31c90 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
31ca0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
31cb0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
31cc0 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
31cd0 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
31ce0 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
31cf0 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
31d00 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
31d10 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
31d20 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
31d30 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
31d40 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
31d50 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
31d60 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
31d70 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
31d80 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
31d90 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
31da0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
31db0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
31dc0 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
31dd0 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
31de0 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
31df0 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
31e00 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
31e10 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
31e20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
31e30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
31e40 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
31e50 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
31e60 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
31e70 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
31e80 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
31e90 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
31ea0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
31eb0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
31ec0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
31ed0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
31ee0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
31ef0 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
31f00 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
31f10 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
31f20 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
31f30 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
31f40 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
31f50 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
31f60 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
31f70 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
31f80 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
31f90 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
31fa0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
31fb0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
31fc0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
31fd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
31fe0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
31ff0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
32000 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
32010 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
32020 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
32030 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
32040 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
32050 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
32060 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
32070 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
32080 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
32090 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
320a0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
320b0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
320c0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
320d0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
320e0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
320f0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
32100 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
32110 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
32120 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
32130 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
32140 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32150 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
32160 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
32170 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32180 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
32190 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
321a0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
321b0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
321c0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
321d0 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
321e0 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
321f0 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
32200 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
32210 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
32220 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
32230 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
32240 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
32250 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
32260 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
32270 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
32280 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
32290 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
322a0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
322b0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
322c0 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
322d0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
322e0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
322f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
32300 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
32310 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
32320 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
32330 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
32340 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
32350 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
32360 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
32370 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
32380 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
32390 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
323a0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
323b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
323c0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
323d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
323e0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
323f0 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
32400 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
32410 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
32420 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
32430 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
32440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32450 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
32460 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
32470 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
32480 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
32490 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
324a0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
324b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
324c0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
324d0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
324e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
324f0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
32500 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
32510 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
32520 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
32530 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
32540 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
32550 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
32560 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
32570 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
32580 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
32590 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
325a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
325b0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
325c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
325d0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
325e0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
325f0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
32600 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
32610 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
32620 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
32630 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
32640 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
32650 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
32660 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
32670 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
32680 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
32690 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
326a0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
326b0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
326c0 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
326d0 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
326e0 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
326f0 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
32700 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
32710 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
32720 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
32730 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
32740 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
32750 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
32760 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
32770 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
32780 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
32790 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
327a0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
327b0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
327c0 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
327d0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
327e0 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
327f0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
32800 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
32810 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
32820 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
32830 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
32840 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
32850 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
32860 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
32870 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
32880 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
32890 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
328a0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
328b0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
328c0 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
328d0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
328e0 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
328f0 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
32900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32910 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
32920 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
32930 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
32940 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
32950 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
32960 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
32970 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
32980 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
32990 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
329a0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
329b0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
329c0 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
329d0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
329e0 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
329f0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
32a00 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
32a10 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
32a20 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
32a30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
32a40 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
32a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
32a60 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
32a70 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
32a80 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
32a90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
32aa0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
32ab0 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
32ac0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
32ad0 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
32ae0 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
32af0 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
32b00 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
32b10 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
32b20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
32b30 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
32b40 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
32b50 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
32b60 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
32b70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
32b80 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
32b90 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
32ba0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
32bb0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
32bc0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
32bd0 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
32be0 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
32bf0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
32c00 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
32c10 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
32c20 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
32c30 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
32c40 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
32c50 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
32c60 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
32c70 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
32c80 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
32c90 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
32ca0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
32cb0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
32cc0 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
32cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
32ce0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
32cf0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
32d00 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
32d10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32d20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
32d30 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
32d40 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
32d50 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
32d60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
32d70 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
32d80 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
32d90 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
32da0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
32db0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
32dc0 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
32dd0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
32de0 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
32df0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
32e00 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
32e10 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
32e20 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
32e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
32e40 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
32e50 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
32e60 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
32e70 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
32e80 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
32e90 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
32ea0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
32eb0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
32ec0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
32ed0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
32ee0 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
32ef0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
32f00 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
32f10 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
32f20 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
32f30 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
32f40 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
32f50 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
32f60 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
32f70 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
32f80 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
32f90 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
32fa0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
32fb0 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
32fc0 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
32fd0 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
32fe0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
32ff0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
33000 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
33010 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
33020 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
33030 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
33040 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
33050 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
33060 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
33070 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
33080 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
33090 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
330a0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
330b0 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
330c0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
330d0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
330e0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
330f0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
33100 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
33110 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
33120 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
33130 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
33140 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
33150 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
33160 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
33170 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
33180 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
33190 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
331a0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
331b0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
331c0 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
331d0 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
331e0 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
331f0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
33200 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
33210 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
33220 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
33230 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
33240 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
33250 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
33260 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
33270 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
33280 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
33290 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
332a0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
332b0 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
332c0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
332d0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
332e0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
332f0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
33300 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
33310 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
33320 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
33330 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
33340 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
33350 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
33360 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
33370 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
33380 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
33390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
333a0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
333b0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
333c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
333d0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
333e0 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
333f0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
33400 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
33410 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
33420 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
33430 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
33440 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
33450 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
33460 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
33470 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
33480 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
33490 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
334a0 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
334b0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
334c0 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
334d0 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
334e0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
334f0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
33500 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
33510 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
33520 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
33530 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
33540 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
33550 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
33560 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
33570 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
33580 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
33590 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
335a0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
335b0 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
335c0 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
335d0 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
335e0 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
335f0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
33600 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
33610 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
33620 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
33630 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
33640 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
33650 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
33660 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
33670 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
33680 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
33690 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
336a0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
336b0 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
336c0 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
336d0 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
336e0 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
336f0 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64  ze("", off).#end
33700 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  if.static int ba
33710 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
33720 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
33730 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
33740 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
33750 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
33760 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
33770 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
33780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33790 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
337a0 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
337b0 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
337c0 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
337d0 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
337e0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
337f0 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
33800 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
33810 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
33820 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
33830 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
33840 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69  root-page */.  i
33850 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20  nt bBulk        
33860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33870 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
33880 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61  all is part of a
33890 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b   bulk load */.){
338a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
338b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
338c0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
338d0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
338e0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
338f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33900 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
33910 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
33920 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
33930 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
33940 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
33950 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
33960 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
33970 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
33980 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33990 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
339a0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
339b0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
339c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
339d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
339e0 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
339f0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
33a00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
33a10 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
33a20 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
33a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
33a40 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
33a50 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
33a60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
33a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
33a80 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
33a90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
33aa0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
33ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
33ac0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
33ad0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
33ae0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
33af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b00 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
33b10 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
33b20 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
33b30 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
33b40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
33b50 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
33b60 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
33b70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
33b80 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
33b90 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
33ba0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
33bb0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
33bc0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
33bd0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
33be0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
33bf0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
33c00 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
33c10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
33c20 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
33c30 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
33c40 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
33c50 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
33c60 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
33c70 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
33c80 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
33c90 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
33ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
33cb0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
33cc0 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
33cd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
33ce0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
33cf0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
33d00 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
33d10 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
33d20 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
33d30 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
33d40 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
33d50 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
33d60 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
33d70 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
33d80 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
33d90 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
33da0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
33db0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
33dc0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
33dd0 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
33de0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
33df0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
33e00 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
33e10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
33e20 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
33e30 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
33e40 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
33e50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33e60 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
33e70 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
33e80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
33e90 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
33ea0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
33eb0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
33ec0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
33ed0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
33ee0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
33ef0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
33f00 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
33f10 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
33f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f30 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
33f40 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
33f50 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
33f60 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
33f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
33f80 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
33f90 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
33fa0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
33fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fc0 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
33fd0 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
33fe0 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
33ff0 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
34000 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
34010 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34020 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
34030 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34040 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34050 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
34060 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
34070 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
34080 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
34090 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
340a0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
340b0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
340c0 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
340d0 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
340e0 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
340f0 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
34100 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
34110 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
34120 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
34130 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
34140 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
34150 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
34160 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
34170 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
34180 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
34190 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
341a0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
341b0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
341c0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
341d0 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
341e0 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
341f0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
34200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34210 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
34220 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
34230 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65  aiOvfl[0]==iPare
34240 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
34250 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
34260 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34270 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
34280 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
34290 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
342a0 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
342b0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
342c0 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
342d0 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
342e0 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
342f0 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
34300 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
34310 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
34320 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
34330 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
34340 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
34350 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
34360 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
34370 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
34380 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
34390 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
343a0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
343b0 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
343c0 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
343d0 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
343e0 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
343f0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
34400 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
34410 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
34420 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
34430 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
34440 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
34450 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
34460 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
34470 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
34480 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
34490 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
344a0 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20   page, since if 
344b0 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79  any existed they
344c0 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20   will.  ** have 
344d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d  already been rem
344e0 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d  oved..  */.  i =
344f0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
34500 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
34510 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
34520 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
34530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
34540 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
34550 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20  || bBulk==1 );. 
34560 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
34570 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
34580 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
34590 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
345a0 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
345b0 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
345c0 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b  xDiv = i-2+bBulk
345d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
345e0 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b     assert( bBulk
345f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44  ==0 );.      nxD
34600 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
34610 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
34620 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20   2-bBulk;.  }.  
34630 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66  nOld = i+1;.  if
34640 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
34650 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
34660 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
34670 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
34680 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
34690 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
346a0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
346b0 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
346c0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
346d0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
346e0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
346f0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
34700 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
34710 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
34720 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
34730 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
34740 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  d[i], 0);.    if
34750 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
34760 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
34770 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
34780 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
34790 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
347a0 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
347b0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
347c0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
347d0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
347e0 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
347f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
34800 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
34810 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
34820 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
34830 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
34840 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
34850 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  nt->apOvfl[0];. 
34860 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
34870 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
34880 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
34890 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
348a0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
348b0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
348c0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
348d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
348e0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
348f0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
34900 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
34910 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
34920 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
34930 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
34940 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
34950 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
34960 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
34970 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
34980 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
34990 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
349a0 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
349b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
349c0 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
349d0 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
349e0 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
349f0 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
34a00 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
34a10 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
34a20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
34a30 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
34a40 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
34a50 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
34a60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
34a70 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
34a80 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
34a90 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
34aa0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
34ab0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
34ac0 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
34ad0 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
34ae0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
34af0 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
34b00 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
34b10 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
34b20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
34b30 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
34b40 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
34b50 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
34b60 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
34b70 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
34b80 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
34b90 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
34ba0 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
34bb0 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
34bc0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
34bd0 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
34be0 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
34bf0 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
34c00 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
34c10 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
34c20 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
34c30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73      if( pBt->bts
34c40 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
34c50 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
34c60 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
34c70 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
34c80 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
34c90 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
34ca0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
34cb0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
34cc0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
34cd0 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
34ce0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
34cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
34d00 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34d10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
34d20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
34d30 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
34d40 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
34d50 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
34d60 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
34d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34d80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
34d90 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
34da0 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
34db0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
34dc0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
34dd0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
34de0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
34df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34e00 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
34e10 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
34e20 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34e30 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
34e40 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
34e50 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
34e60 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
34e70 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
34e80 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
34e90 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
34ea0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
34eb0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
34ec0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
34ed0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
34ee0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
34ef0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
34f00 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
34f10 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
34f20 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
34f30 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
34f40 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
34f50 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
34f60 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
34f70 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
34f80 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
34f90 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
34fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
34fb0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
34fc0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
34ff0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
35000 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
35010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35030 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
35040 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
35050 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
35060 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
35070 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
35080 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
35090 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
350a0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
350b0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
350c0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
350d0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
350e0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
350f0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
35100 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
35110 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
35120 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
35130 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
35140 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
35150 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
35160 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
35170 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
35180 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
35190 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
351a0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
351b0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
351c0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
351d0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
351e0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
351f0 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64  remove the divid
35200 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er cells.  ** fr
35210 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
35220 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
35230 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
35240 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
35250 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
35260 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
35270 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
35280 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
35290 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
352a0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
352b0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
352c0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
352d0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
352e0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
352f0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
35300 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
35310 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
35320 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
35330 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
35340 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
35350 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
35360 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
35370 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
35380 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
35390 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
353a0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
353b0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
353c0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
353d0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
353e0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
353f0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
35400 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
35410 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
35420 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
35430 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
35440 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
35450 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
35460 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
35470 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
35480 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
35490 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
354a0 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
354b0 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
354c0 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
354d0 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
354e0 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
354f0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
35500 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
35510 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
35520 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
35530 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
35540 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
35550 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
35560 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
35570 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
35580 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
35590 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
355a0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
355b0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
355c0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
355d0 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
355e0 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
355f0 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
35600 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
35610 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
35620 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
35630 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
35640 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
35650 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
35660 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
35670 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
35680 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
35690 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
356a0 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
356b0 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
356c0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
356d0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
356e0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
356f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
35700 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
35710 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
35720 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
35730 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
35740 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
35750 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
35760 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
35770 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
35780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35790 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f    u8 *aData = pO
357a0 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  ld->aData;.     
357b0 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20   u16 maskPage = 
357c0 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a  pOld->maskPage;.
357d0 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66        u16 cellOf
357e0 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c  fset = pOld->cel
357f0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66  lOffset;.      f
35800 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
35810 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
35820 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
35830 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
35840 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
35850 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61  = findCellv2(aDa
35860 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65  ta, maskPage, ce
35870 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20  llOffset, j);.  
35880 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
35890 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
358a0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
358b0 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
358c0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
358d0 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20  .    }       .  
358e0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
358f0 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
35900 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
35910 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
35920 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
35930 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
35940 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35950 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
35960 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
35970 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
35980 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
35990 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
359a0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
359b0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
359c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
359d0 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e  ( iSpace1 <= (in
359e0 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
359f0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
35a00 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
35a10 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65   sz);.      apCe
35a20 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
35a30 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
35a40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
35a50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
35a60 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
35a70 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
35a80 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
35a90 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20  szCell[nCell] - 
35aa0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
35ab0 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
35ac0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
35ad0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
35ae0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
35af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
35b00 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  ld->hdrOffset==0
35b10 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
35b20 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
35b30 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
35b40 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
35b50 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
35b60 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
35b70 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
35b80 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
35b90 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
35ba0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d   &pOld->aData[8]
35bb0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
35bc0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
35bd0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
35be0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
35bf0 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
35c00 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
35c10 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
35c20 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
35c30 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
35c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a   */.          sz
35c50 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
35c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35c70 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
35c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35c90 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
35ca0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
35cb0 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
35cc0 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
35cd0 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
35ce0 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
35cf0 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
35d00 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
35d10 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
35d20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
35d30 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
35d40 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
35d50 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
35d60 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
35d70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
35d80 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
35d90 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
35da0 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
35db0 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
35dc0 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
35dd0 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
35de0 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
35df0 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
35e00 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
35e10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
35e20 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
35e30 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
35e40 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
35e50 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
35e60 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
35e70 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
35e80 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
35e90 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
35ea0 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
35ec0 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
35ed0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
35ee0 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
35ef0 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
35f00 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
35f10 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
35f20 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
35f30 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
35f40 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35f50 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
35f60 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
35f70 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
35f80 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
35f90 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
35fa0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
35fb0 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
35fc0 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
35fd0 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
35fe0 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
35ff0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
36000 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
36010 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
36020 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
36030 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
36040 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
36050 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
36060 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e  +;.      if( k>N
36070 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  B+1 ){ rc = SQLI
36080 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36090 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
360a0 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
360b0 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
360c0 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
360d0 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
360e0 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
360f0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
36100 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
36110 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
36120 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
36130 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
36140 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
36150 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
36160 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
36170 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
36180 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
36190 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
361a0 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
361b0 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
361c0 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
361d0 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
361e0 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
361f0 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
36200 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
36210 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
36220 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
36230 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
36240 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
36250 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
36260 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
36270 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
36280 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
36290 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
362a0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
362b0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
362c0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
362d0 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
362e0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
362f0 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
36300 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
36310 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
36320 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
36330 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
36340 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
36350 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
36360 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
36370 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
36380 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
36390 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
363a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
363b0 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
363c0 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
363d0 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
363e0 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
363f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
36400 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
36410 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
36420 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
36430 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
36440 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
36450 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
36460 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
36470 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
36480 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
36490 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
364a0 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  ight==0 .       
364b0 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a  || (!bBulk && sz
364c0 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
364d0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
364e0 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b  l[r]+2)) .    ){
364f0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
36500 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
36510 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
36520 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
36530 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
36540 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
36550 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
36560 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
36570 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
36580 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
36590 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
365a0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
365b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
365c0 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
365d0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
365e0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
365f0 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
36600 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
36610 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
36620 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
36630 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
36640 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
36650 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
36660 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
36670 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a  that page..  **.
36680 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68    ** UPDATE:  Th
36690 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
366a0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
366b0 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20  ily true if the 
366c0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
366d0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  le is corrupt.  
366e0 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  The corruption w
366f0 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20  ill be detected 
36700 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
36710 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  er.  ** in this 
36720 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65  procedure so the
36730 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
36740 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77   act upon it now
36750 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  ..  */.#if 0.  a
36760 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
36770 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
36780 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
36790 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
367a0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45  .#endif..  TRACE
367b0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
367c0 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
367d0 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
367e0 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
367f0 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
36800 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
36810 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
36820 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
36830 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
36840 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
36850 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
36860 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
36870 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
36880 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
36890 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
368a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
368b0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
368c0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
368d0 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
368e0 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
368f0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
36900 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
36910 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
36920 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
36930 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
36940 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
36950 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
36960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36970 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
36980 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36990 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
369a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
369b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
369c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
369d0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
369e0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
369f0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
36a00 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42  pNew, &pgno, (bB
36a10 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c  ulk ? 1 : pgno),
36a20 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
36a30 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
36a40 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
36a50 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
36a60 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
36a70 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
36a80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36a90 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
36aa0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
36ab0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
36ac0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
36ad0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
36ae0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
36af0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
36b00 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
36b10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36b30 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
36b40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
36b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36b60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
36b70 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
36b80 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
36b90 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
36ba0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
36bb0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
36bc0 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
36bd0 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
36be0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
36bf0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
36c00 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
36c10 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
36c20 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
36c30 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
36c40 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
36c50 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
36c60 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
36c70 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
36c80 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
36c90 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
36ca0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
36cb0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
36cc0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
36cd0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
36ce0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
36cf0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
36d00 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
36d10 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
36d20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
36d30 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
36d40 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
36d50 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
36d60 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
36d70 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
36d80 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
36d90 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
36da0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
36db0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
36dc0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
36dd0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
36de0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
36df0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
36e00 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
36e10 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
36e20 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
36e30 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
36e40 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
36e50 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
36e60 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
36e70 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
36e80 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
36e90 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
36ea0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
36eb0 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
36ec0 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
36ed0 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
36ee0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
36ef0 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
36f00 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
36f10 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
36f20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
36f30 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65  nI>i ){.      Me
36f40 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
36f50 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
36f60 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
36f70 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
36f80 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
36f90 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
36fa0 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
36fb0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
36fc0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
36fd0 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
36fe0 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
36ff0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
37000 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
37010 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
37020 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
37030 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
37040 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
37050 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
37060 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
37070 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
37080 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
37090 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
370a0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
370b0 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
370c0 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
370d0 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
370e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
370f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37100 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
37110 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
37120 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
37130 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
37140 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
37150 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
37160 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
37170 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
37180 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
37190 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
371a0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
371b0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
371c0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
371d0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
371e0 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
371f0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
37200 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
37210 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
37220 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
37230 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
37240 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
37250 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
37260 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
37270 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
37280 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
37290 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
372a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
372b0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
372c0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
372d0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
372e0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
372f0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
37300 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
37310 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
37320 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
37330 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
37340 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
37350 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
37360 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
37370 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
37380 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
37390 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
373a0 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
373b0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
373c0 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
373d0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
373e0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
373f0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
37400 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
37410 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
37420 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
37430 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
37440 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
37450 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
37460 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
37470 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
37480 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
37490 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
374a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
374b0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
374c0 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
374d0 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
374e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
374f0 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
37500 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
37510 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
37520 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
37530 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
37540 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
37550 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
37560 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
37570 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
37580 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
37590 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
375a0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
375b0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
375c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
375d0 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
375e0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
375f0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
37600 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
37610 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
37620 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
37630 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
37640 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
37650 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
37660 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
37670 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
37680 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
37690 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
376a0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
376b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
376c0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
376d0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
376e0 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
376f0 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
37700 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
37710 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
37720 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
37730 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
37740 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
37750 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
37760 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
37770 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
37780 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
37790 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
377a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
377b0 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e btreeParseCell
377c0 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
377d0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
377e0 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
377f0 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
37800 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
37810 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
37820 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
37830 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
37840 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
37850 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
37860 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
37870 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
37880 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
37890 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
378a0 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
378b0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
378c0 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
378d0 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
378e0 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
378f0 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
37900 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
37910 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
37920 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
37930 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
37940 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
37950 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
37960 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37970 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
37980 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
37990 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
379a0 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
379b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
379c0 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70   }.      iOvflSp
379d0 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
379e0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
379f0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b  ->maxLocal+23 );
37a00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37a10 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e  OvflSpace <= (in
37a20 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
37a30 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43  );.      insertC
37a40 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
37a50 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
37a60 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Temp, pNew->pgno
37a70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
37a80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37a90 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
37aa0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
37ab0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
37ac0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
37ad0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
37ae0 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
37af0 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
37b00 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
37b10 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
37b20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
37b30 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
37b40 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
37b50 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
37b60 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
37b70 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
37b80 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
37b90 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
37ba0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
37bb0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
37bc0 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
37bd0 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
37be0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
37bf0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
37c00 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
37c10 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
37c20 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
37c30 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
37c40 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
37c50 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
37c60 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
37c70 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
37c80 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
37c90 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
37ca0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
37cb0 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
37cc0 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
37cd0 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
37ce0 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
37cf0 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
37d00 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
37d10 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
37d20 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
37d30 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
37d40 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
37d50 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
37d60 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
37d70 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
37d80 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
37d90 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
37da0 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
37db0 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
37dc0 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
37dd0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
37de0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
37df0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
37e00 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
37e10 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
37e20 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
37e30 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
37e40 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
37e50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
37e60 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
37e70 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
37e80 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
37e90 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
37ea0 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
37eb0 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
37ec0 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
37ed0 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
37ee0 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
37ef0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
37f00 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
37f10 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
37f20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
37f30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
37f40 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
37f50 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
37f60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
37f70 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
37f80 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
37f90 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
37fa0 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
37fb0 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
37fc0 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
37fd0 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f  ) .    );.    co
37fe0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
37ff0 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c  New[0], pParent,
38000 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50   &rc);.    freeP
38010 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72  age(apNew[0], &r
38020 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
38030 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
38040 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70      /* Fix the p
38050 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
38060 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63  es for all the c
38070 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73  ells that were s
38080 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a  hifted around. .
38090 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
380a0 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
380b0 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e  nt types of poin
380c0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
380d0 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20  that need to.   
380e0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
380f0 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  h by this routin
38100 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65  e. Some of these
38110 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
38120 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20  lready, but.    
38130 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74  ** many have not
38140 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
38150 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20  is a summary:.  
38160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29    **.    **   1)
38170 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
38180 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
38190 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
381a0 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20  hat were not.   
381b0 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67   **      sibling
381c0 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  s when this func
381d0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
381e0 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65   These have alre
381f0 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ady.    **      
38200 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e  been set. We don
38210 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79  't need to worry
38220 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69   about old sibli
38230 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20  ngs that were.  
38240 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20    **      moved 
38250 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
38260 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28   - the freePage(
38270 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e  ) code has taken
38280 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   care.    **    
38290 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20    of those..    
382a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54  **.    **   2) T
382b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
382c0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
382d0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
382e0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
382f0 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
38300 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
38310 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
38320 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
38330 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se .    **      
38340 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
38350 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
38360 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
38370 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
38380 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33     **.    **   3
38390 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
383a0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
383b0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
383c0 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20  child pages of. 
383d0 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73     **      cells
383e0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73   stored on the s
383f0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79  ibling pages may
38400 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
38410 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
38420 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73  **   4) If the s
38430 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
38440 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e   not internal in
38450 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e  tkey nodes, then
38460 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20   any.    **     
38470 20 6f 76 65 72 66 6c 6f 77 2