/ Hex Artifact Content
Login

Artifact c46043fbb09c18a19bdb96eadde6e724901d6fcf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 64 62 2d  if( (pBtree->db-
14c0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
14d0: 4f 74 61 4d 6f 64 65 29 0a 20 20 20 7c 7c 20 28  OtaMode).   || (
14e0: 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65  pBtree->sharable
14f0: 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63  ==0).   || (eLoc
1500: 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b  kType==READ_LOCK
1510: 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d   && (pBtree->db-
1520: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1530: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1540: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
1550: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
1560: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1570: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1580: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1590: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
15a0: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
15b0: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
15c0: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
15d0: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
15e0: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
15f0: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1600: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1610: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1620: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1630: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1640: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1650: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1660: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1670: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1680: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1690: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
16a0: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
16b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
16c0: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
16d0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
16e0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
16f0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1700: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1710: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1720: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1730: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1740: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1750: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1760: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1770: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1780: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1790: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
17a0: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
17b0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
17c0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
17d0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
17e0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
17f0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1800: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1810: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1820: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1830: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1840: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1850: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1860: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1870: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1880: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1890: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18a0: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
18b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
18c0: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
18d0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
18e0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
18f0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1900: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1910: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1920: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1930: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1940: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1950: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1960: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1970: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1980: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1990: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
19a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
19b0: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
19c0: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
19d0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
19e0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
19f0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1a00: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1a10: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1a20: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1a30: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1a40: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1a50: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1a60: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1a70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a80: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1a90: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1aa0: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1ab0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1ac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1ad0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1ae0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1af0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b00: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1b10: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1b20: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1b30: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1b40: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1b50: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1b60: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1b70: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1b80: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1b90: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1ba0: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1bb0: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1bc0: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
1bd0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
1be0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
1bf0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
1c00: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
1c10: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
1c20: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1c30: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1c40: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1c50: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1c60: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1c70: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1c80: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1c90: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1ca0: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1cb0: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1cc0: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
1cd0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
1ce0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
1cf0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
1d00: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
1d10: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
1d20: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1d30: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1d40: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1d50: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1d60: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1d70: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1d80: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1d90: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1db0: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
1dd0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
1de0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
1df0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
1e00: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1e10: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
1e20: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1e30: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1e40: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1e50: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1e60: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1e70: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1e80: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1e90: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1ea0: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ec0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ed0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ee0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ef0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1f00: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1f10: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1f20: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1f30: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1f40: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1f50: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1f60: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1f70: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1f80: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1f90: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1fa0: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1fb0: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1fc0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1fd0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1fe0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1ff0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2000: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
2010: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
2020: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
2030: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2040: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2050: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2060: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2070: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2080: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2090: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
20a0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
20b0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
20c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
20d0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
20e0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
20f0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
2100: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
2110: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
2120: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
2130: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
2140: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
2150: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
2160: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
2170: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
2180: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
2190: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
21a0: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
21b0: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
21c0: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
21d0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
21e0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
21f0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
2200: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
2210: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
2220: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
2230: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
2240: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
2250: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2260: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
2270: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
2280: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
2290: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
22a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
22b0: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
22c0: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
22d0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
22e0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
22f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2300: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
2310: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2320: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
2330: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
2340: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
2350: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
2360: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
2370: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
2380: 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62  er!=p && (pBt->b
2390: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
23a0: 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20  CLUSIVE)!=0 ){. 
23b0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
23c0: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
23d0: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
23e0: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
23f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
2400: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
2410: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2420: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2430: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2440: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
2450: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
2460: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
2470: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2480: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
2490: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
24a0: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
24b0: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
24c0: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
24d0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
24e0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
24f0: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
2500: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
2510: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
2520: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
2530: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
2540: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
2550: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
2560: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
2570: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2580: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2590: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
25a0: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
25b0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
25d0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
25e0: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
25f0: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2600: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2610: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
2620: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
2630: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
2640: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
2650: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
2660: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
2670: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2680: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2690: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
26a0: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
26b0: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
26c0: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
26d0: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
26e0: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
26f0: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2700: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2710: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
2720: 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  |= BTS_PENDING;.
2730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2750: 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
2760: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2770: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2780: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
2790: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
27a0: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
27b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
27c0: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41  ED_CACHE./*.** A
27d0: 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dd a lock on the
27e0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
27f0: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20  -page iTable to 
2800: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
2810: 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65   used.** by Btre
2820: 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61  e handle p. Para
2830: 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74  meter eLock must
2840: 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f   be either READ_
2850: 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54  LOCK or .** WRIT
2860: 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  E_LOCK..**.** Th
2870: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
2880: 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  mes the followin
2890: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54  g:.**.**   (a) T
28a0: 68 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72  he specified Btr
28b0: 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63  ee object p is c
28c0: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68  onnected to a sh
28d0: 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20  arable.**       
28e0: 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69  database (one wi
28f0: 74 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  th the BtShared.
2900: 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65  sharable flag se
2910: 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  t), and.**.**   
2920: 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72  (b) No other Btr
2930: 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20  ee objects hold 
2940: 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66  a lock that conf
2950: 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77  licts.**       w
2960: 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65  ith the requeste
2970: 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65  d lock (i.e. que
2980: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2990: 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20  leLock() has.** 
29a0: 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65        already be
29b0: 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65  en called and re
29c0: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b  turned SQLITE_OK
29d0: 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  )..**.** SQLITE_
29e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
29f0: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
2a00: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
2a10: 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a  . SQLITE_NOMEM .
2a20: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
2a30: 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d  f a malloc attem
2a40: 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  pt fails..*/.sta
2a50: 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65  tic int setShare
2a60: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2a70: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
2a80: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
2a90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2aa0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
2ab0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
2ac0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
2ad0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2ae0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2af0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
2b00: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b10: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
2b20: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
2b30: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
2b40: 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65  );..  /* A conne
2b50: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72  ction with the r
2b60: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2b70: 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65  flag set will ne
2b80: 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20  ver try to.  ** 
2b90: 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f  obtain a read-lo
2ba0: 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75  ck using this fu
2bb0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79  nction. The only
2bc0: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69   read-lock obtai
2bd0: 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f  ned.  ** by a co
2be0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64  nnection in read
2bf0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64  -uncommitted mod
2c00: 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69  e is on the sqli
2c10: 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20  te_master .  ** 
2c20: 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20  table, and that 
2c30: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
2c40: 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72   in BtreeBeginTr
2c50: 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73  ans().  */.  ass
2c60: 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e  ert( 0==(p->db->
2c70: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
2c80: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c  dUncommitted) ||
2c90: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2ca0: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
2cb0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2cc0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2cd0: 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d  on a sharable b-
2ce0: 74 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20  tree after it . 
2cf0: 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74   ** has been det
2d00: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
2d10: 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c  other b-tree hol
2d20: 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67  ds a conflicting
2d30: 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
2d40: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2d50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
2d60: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2d70: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2d80: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2d90: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2da0: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2db0: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2dc0: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
2dd0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
2de0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
2df0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
2e00: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
2e10: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
2e20: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2e30: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2e40: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2e50: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2e70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
2e80: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
2e90: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
2ea0: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
2eb0: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
2ec0: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
2ed0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
2ee0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
2ef0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
2f00: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
2f10: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
2f20: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
2f30: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
2f40: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
2f50: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
2f60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f70: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2f80: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
2f90: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
2fa0: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
2fb0: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
2fc0: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
2fd0: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
2fe0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
2ff0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
3000: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
3010: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
3020: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
3030: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
3040: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
3050: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
3060: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
3070: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
3080: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
3090: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
30a0: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
30b0: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
30c0: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
30d0: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
30e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
30f0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
3100: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
3110: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
3120: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
3130: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
3140: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
3150: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
3160: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
3170: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3180: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
3190: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
31a0: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
31b0: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
31c0: 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61  to.** the setSha
31d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
31e0: 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68  k() procedure) h
31f0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a  eld by Btree obj
3200: 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ect p..**.** Thi
3210: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
3220: 65 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20  es that Btree p 
3230: 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64  has an open read
3240: 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72   or write .** tr
3250: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74  ansaction. If it
3260: 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20   does not, then 
3270: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
3280: 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69  flag.** may be i
3290: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72  ncorrectly clear
32a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
32b0: 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65  id clearAllShare
32c0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
32d0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
32e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
32f0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
3300: 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e  *ppIter = &pBt->
3310: 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74  pLock;..  assert
3320: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3330: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
3340: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
3350: 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74  able || 0==*ppIt
3360: 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
3370: 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a  p->inTrans>0 );.
3380: 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65  .  while( *ppIte
3390: 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  r ){.    BtLock 
33a0: 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72  *pLock = *ppIter
33b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
33c0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
33d0: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30  TS_EXCLUSIVE)==0
33e0: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
33f0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
3400: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
3410: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
3420: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
3430: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
3440: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3450: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3460: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
34a0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
34b0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
34c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
34d0: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
34e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
34f0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
3500: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
3510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
3520: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
3530: 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
3540: 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ING)==0 || pBt->
3550: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
3560: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3570: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
3580: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3590: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
35a0: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
35b0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d  TS_PENDING);.  }
35c0: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
35d0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
35e0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
35f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3600: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
3610: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
3620: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
3630: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
3640: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
3650: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3660: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3670: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3680: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3690: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
36a0: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
36b0: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
36c0: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
36d0: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
36e0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
36f0: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54     ** set the BT
3700: 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74  S_PENDING flag t
3710: 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 0..    **.    
3720: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
3730: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77  ot currently a w
3740: 72 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f  riter, then BTS_
3750: 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20  PENDING must.   
3760: 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65   ** be zero alre
3770: 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78  ady. So this nex
3780: 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65  t line is harmle
3790: 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ss in that case.
37a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
37b0: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
37c0: 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d  S_PENDING;.  }.}
37d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
37e0: 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c  ction changes al
37f0: 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65  l write-locks he
3800: 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e  ld by Btree p in
3810: 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a  to read-locks..*
3820: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f  /.static void do
3830: 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
3840: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
3850: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
3860: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
3870: 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  pBt;.  if( pBt->
3880: 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20  pWriter==p ){.  
3890: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b    BtLock *pLock;
38a0: 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65  .    pBt->pWrite
38b0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
38c0: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  btsFlags &= ~(BT
38d0: 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f  S_EXCLUSIVE|BTS_
38e0: 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f  PENDING);.    fo
38f0: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3900: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3910: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3920: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3930: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
3940: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
3950: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
3960: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
3970: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
3980: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3990: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
39a0: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
39b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
39c0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
39d0: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
39e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
39f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3a00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3a10: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3a20: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
3a30: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
3a40: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
3a50: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
3a60: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
3a70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3a80: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3a90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3aa0: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3ab0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3ac0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3ad0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3ae0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
3af0: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3b00: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
3b10: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
3b20: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3b30: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
3b40: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3b50: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
3b60: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
3b70: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
3b80: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
3b90: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
3ba0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
3bb0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3bc0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3bd0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3be0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3bf0: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3c00: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3c20: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3c30: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3c40: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3c50: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3c60: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3c70: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3c80: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3c90: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3ca0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3cc0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3cd0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3ce0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3cf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3d00: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
3d10: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
3d20: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3d30: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
3d40: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
3d50: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
3d60: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
3d70: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
3d80: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
3d90: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
3da0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
3db0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
3dc0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
3dd0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
3de0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
3df0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
3e00: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3e10: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
3e20: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
3e30: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
3e40: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
3e50: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
3e60: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
3e70: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
3e80: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
3e90: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
3ea0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
3eb0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
3ec0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
3ed0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
3ee0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
3ef0: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
3f00: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
3f10: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3f20: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
3f30: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
3f40: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
3f50: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
3f60: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
3f80: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
3f90: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69  check */.  i64 i
3fa0: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
3fb0: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
3fc0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
3fd0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
3fe0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
3ff0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
4000: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
4010: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
4020: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
4030: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
4040: 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20   pBtree->pBt;.  
4050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
4060: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
4070: 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28  Btree) );.  for(
4080: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
4090: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
40a0: 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46      if( (p->curF
40b0: 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72  lags & BTCF_Incr
40c0: 62 6c 6f 62 29 21 3d 30 20 26 26 20 28 69 73 43  blob)!=0 && (isC
40d0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
40e0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
40f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74   ){.      p->eSt
4100: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4110: 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ALID;.    }.  }.
4120: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4130: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4140: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4150: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4160: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4170: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
4180: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
4190: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
41a0: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
41b0: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
41c0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
41d0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
41e0: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
41f0: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
4200: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
4210: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
4220: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
4230: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
4240: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
4250: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4260: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
4270: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
4280: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
4290: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
42a0: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
42b0: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
42c0: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
42d0: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
42e0: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
42f0: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
4300: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
4310: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
4320: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
4330: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
4340: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
4350: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
4360: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
4370: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
4380: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4390: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
43a0: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
43b0: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
43c0: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
43d0: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
43e0: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
43f0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
4400: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
4410: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
4420: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
4430: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
4440: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4450: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
4460: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
4470: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
4480: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4490: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
44a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
44b0: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
44c0: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
44d0: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
44e0: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
44f0: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
4500: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
4510: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
4520: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
4530: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
4540: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
4550: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
4560: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
4570: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
4580: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4590: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
45a0: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
45b0: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
45c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
45d0: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
45e0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
45f0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4600: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
4610: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4620: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
4630: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4640: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
4650: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4660: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
4670: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
4680: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4690: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
46a0: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
46b0: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
46c0: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
46d0: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
46e0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
46f0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4700: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
4710: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
4720: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4730: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4740: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
4750: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
4760: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
4770: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4780: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4790: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
47a0: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
47b0: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
47c0: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
47d0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
47e0: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
47f0: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4800: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
4810: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4820: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4830: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4840: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4850: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4860: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4870: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4880: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
4890: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
48a0: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
48b0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
48c0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
48d0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
48e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
48f0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4900: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4910: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
4920: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
4930: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4940: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
4950: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
4960: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4970: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
4980: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
49a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
49b0: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
49c0: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
49d0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
49e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
49f0: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
4a00: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
4a10: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4a20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
4a30: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
4a40: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
4a50: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
4a60: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4a70: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
4a80: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4a90: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
4aa0: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
4ab0: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
4ac0: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
4ad0: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
4ae0: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
4af0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
4b00: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
4b10: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
4b20: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
4b30: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
4b40: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
4b50: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4b60: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
4b70: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
4b80: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
4b90: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
4ba0: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
4bb0: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
4bc0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4bd0: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
4be0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
4bf0: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
4c00: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
4c10: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
4c20: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
4c30: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
4c40: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
4c50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4c60: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
4c70: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
4c80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
4c90: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
4ca0: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
4cb0: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
4cc0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4cd0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
4ce0: 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ase all of the a
4cf0: 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f  pPage[] pages fo
4d00: 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
4d10: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4d20: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
4d30: 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a  Pages(BtCursor *
4d40: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
4d50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
4d60: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
4d70: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
4d80: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
4d90: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  );.    pCur->apP
4da0: 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  age[i] = 0;.  }.
4db0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
4dc0: 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61  -1;.}.../*.** Sa
4dd0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
4de0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69  ursor position i
4df0: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20  n the variables 
4e00: 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a  BtCursor.nKey .*
4e10: 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70  * and BtCursor.p
4e20: 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27  Key. The cursor'
4e30: 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  s state is set t
4e40: 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  o CURSOR_REQUIRE
4e50: 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SEEK..**.** The 
4e60: 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
4e70: 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
4e80: 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73  or is valid (has
4e90: 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f   eState==CURSOR_
4ea0: 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20  VALID).** prior 
4eb0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
4ec0: 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74  routine.  .*/.st
4ed0: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
4ee0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
4ef0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
4f00: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
4f10: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
4f20: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
4f30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
4f40: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
4f50: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
4f60: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
4f70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
4f80: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
4f90: 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20   &pCur->nKey);. 
4fa0: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
4fb0: 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65  ITE_OK );  /* Ke
4fc0: 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66  ySize() cannot f
4fd0: 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ail */..  /* If 
4fe0: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
4ff0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5000: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
5010: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
5020: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
5030: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
5040: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
5050: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
5060: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
5070: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
5080: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
5090: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
50a0: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
50b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
50c0: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
50d0: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
50e0: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
50f0: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
5100: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5110: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
5120: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69  ntKey ){.    voi
5130: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
5140: 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43  3Malloc( (int)pC
5150: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5160: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5180: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
5190: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
51a0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
51d0: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
51e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
51f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5200: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5230: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5240: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
5250: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
5260: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5270: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
5280: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
5290: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
52a0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
52b0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
52c0: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
52d0: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
52e0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
52f0: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5300: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5310: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5320: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5330: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5340: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5350: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
5360: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
5370: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
5380: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
5390: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
53a0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
53b0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
53c0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
53d0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
53e0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
53f0: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5400: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5410: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5420: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5430: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5440: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
5450: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
5460: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
5470: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
5480: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
5490: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
54a0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
54b0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
54c0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
54d0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
54e0: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
54f0: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5500: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5510: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5520: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5530: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5540: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
5550: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
5560: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
5570: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
5580: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
5590: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
55a0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
55b0: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
55c0: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
55d0: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
55e0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
55f0: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5600: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5610: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5620: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5630: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5640: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5650: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5660: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
5670: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
5680: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
5690: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
56a0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
56b0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
56c0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
56d0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
56e0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
56f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5700: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5710: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5720: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5730: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5740: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
5750: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
5760: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
5770: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
5780: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
5790: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
57a0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
57b0: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
57c0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
57d0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
57e0: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
57f0: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5800: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5810: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5820: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5830: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5840: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
5850: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
5860: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
5870: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
5880: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
5890: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
58a0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  or *p,          
58b0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
58c0: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
58d0: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
58e0: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
58f0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
5900: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
5910: 20 69 52 6f 6f 74 2e 20 20 53 61 76 65 20 61 6c   iRoot.  Save al
5920: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
5930: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5940: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
5950: 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72  save this cursor
5960: 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20   */.){.  do{.   
5970: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5980: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5990: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
59a0: 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ot) ){.      if(
59b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
59c0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
59d0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
59e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59f0: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
5a00: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
5a10: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5a20: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
5a30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5a40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
5a50: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
5a60: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
5a70: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
5a80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
5a90: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
5aa0: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
5ab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5ac0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5ad0: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5ae0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5af0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5b00: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5b10: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5b20: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5b30: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5b40: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5b50: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
5b60: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
5b70: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
5b80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
5b90: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
5ba0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
5bb0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5bc0: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5bd0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5be0: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5bf0: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5c00: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5c10: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5c20: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5c30: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5c40: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5c50: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
5c60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5c70: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
5c80: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
5c90: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
5ca0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
5cb0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5cc0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5cd0: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5ce0: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5cf0: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5d00: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5d10: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5d20: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5d30: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5d40: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5d50: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
5d60: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
5d70: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
5d80: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
5d90: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
5da0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
5db0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5dc0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5de0: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5df0: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5e00: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5e10: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5e20: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
5e30: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5e40: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5e50: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
5e60: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
5e70: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
5e80: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
5e90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
5ea0: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
5eb0: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
5ec0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
5ed0: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
5ee0: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
5ef0: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
5f00: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
5f10: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
5f20: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
5f30: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5f40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71  TE_NOMEM;.    sq
5f50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
5f60: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
5f70: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
5f80: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
5f90: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
5fa0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
5fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5fc0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
5fd0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
5fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5ff0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6000: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6010: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
6020: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6030: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
6040: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
6050: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
6060: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
6070: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
6080: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6090: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
60a0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
60b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
60c0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
60d0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
60e0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
60f0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6100: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6110: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6120: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6130: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6140: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6150: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6160: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6170: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6180: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6190: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
61a0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
61b0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
61c0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
61d0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
61e0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
61f0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6200: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6210: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6220: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6230: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
6240: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
6250: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
6260: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6270: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6280: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
6290: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
62a0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
62b0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
62c0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
62d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
62e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
62f0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
6300: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
6310: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
6320: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
6330: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
6340: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6350: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
6360: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
6370: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
6380: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
6390: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
63a0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
63b0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
63c0: 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
63d0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
63e0: 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
63f0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
6400: 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
6410: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49  ate = CURSOR_SKI
6420: 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  PNEXT;.    }.  }
6430: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6440: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
6450: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
6460: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
6470: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
6480: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
6490: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
64a0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
64b0: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
64c0: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
64d0: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
64e0: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
64f0: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
6500: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65  the position whe
6510: 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73  re.** it was las
6520: 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73  t placed, or has
6530: 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65   been invalidate
6540: 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  d for any other 
6550: 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f  reason..** Curso
6560: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
6570: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
6580: 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73  e pointing at is
6590: 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20   deleted out.** 
65a0: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c  from under them,
65b0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43   for example.  C
65c0: 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f  ursor might also
65d0: 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65 65   move if a btree
65e0: 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65  .** is rebalance
65f0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  d..**.** Calling
6600: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
6610: 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72  th a NULL cursor
6620: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73   pointer returns
6630: 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73   false..**.** Us
6640: 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20 73  e the separate s
6650: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6660: 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69  rRestore() routi
6670: 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  ne to restore a 
6680: 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74  cursor.** back t
6690: 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68 74  o where it ought
66a0: 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20 72   to be if this r
66b0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
66c0: 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rue..*/.int sqli
66d0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
66e0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
66f0: 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
6700: 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
6710: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
6720: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LID;.}../*.** Th
6730: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f  is routine resto
6740: 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63  res a cursor bac
6750: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
6760: 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72  l position after
6770: 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20   it.** has been 
6780: 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75  moved by some ou
6790: 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28  tside activity (
67a0: 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20  such as a btree 
67b0: 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20  rebalance or.** 
67c0: 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65  a row having bee
67d0: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
67e0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
67f0: 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e  sor).  .**.** On
6800: 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70   success, the *p
6810: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72  DifferentRow par
6820: 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20  ameter is false 
6830: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
6840: 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e   left.** pointin
6850: 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65  g at exactly the
6860: 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69   same row.  *pDi
6870: 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65  fferntRow is the
6880: 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a   row the cursor.
6890: 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20  ** was pointing 
68a0: 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  to has been dele
68b0: 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65  ted, forcing the
68c0: 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
68d0: 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72   to some.** near
68e0: 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68  by row..**.** Th
68f0: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
6900: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
6910: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
6920: 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64  at just returned
6930: 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71  .** TRUE from sq
6940: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6950: 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69  HasMoved()..*/.i
6960: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
6970: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43  ursorRestore(BtC
6980: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
6990: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29   *pDifferentRow)
69a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
69b0: 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
69c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
69d0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
69e0: 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
69f0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6a00: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
6a10: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
6a20: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
6a30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
6a40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
6a50: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
6a60: 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45 52 28 70  VALID || NEVER(p
6a70: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30  Cur->skipNext!=0
6a80: 29 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  ) ){.    *pDiffe
6a90: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
6aa0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44 69 66 66  else{.    *pDiff
6ab0: 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20  erentRow = 0;.  
6ac0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6ad0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
6ae0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6af0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
6b00: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6b10: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6b20: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6b30: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6b40: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6b50: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6b60: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6b70: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6b80: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6b90: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6ba0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
6bb0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
6bc0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
6bd0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
6be0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
6bf0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
6c00: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
6c10: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
6c20: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
6c30: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
6c40: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
6c50: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
6c60: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6c70: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
6c80: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6c90: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
6ca0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
6cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6cc0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6cd0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
6ce0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
6cf0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
6d00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
6d10: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
6d20: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
6d30: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
6d40: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
6d50: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
6d60: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
6d70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6d80: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
6d90: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
6da0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
6db0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
6dc0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
6dd0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6de0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
6df0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
6e00: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
6e10: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
6e20: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
6e30: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
6e40: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6e50: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
6e60: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
6e70: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
6e80: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
6e90: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
6ea0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
6eb0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
6ec0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
6ed0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
6ee0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
6ef0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
6f00: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
6f10: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
6f20: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6f30: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
6f40: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
6f50: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6f60: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
6f70: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6f80: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6f90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6fa0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
6fb0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
6fc0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6fd0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
6ff0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7000: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7010: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7020: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7030: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7040: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7050: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7060: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7070: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7080: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7090: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
70a0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
70b0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
70c0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
70d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
70e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
70f0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7100: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7110: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7120: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7130: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7140: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7150: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7160: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7170: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7180: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7190: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
71a0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
71b0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
71c0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
71d0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
71e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
71f0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7200: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7210: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7220: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7230: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7240: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7250: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7260: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7270: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7280: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7290: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
72a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
72b0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
72c0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
72d0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
72e0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
72f0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7300: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7310: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7320: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7330: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7340: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7350: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7360: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7370: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7380: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7390: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
73a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
73b0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
73c0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
73d0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
73e0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
73f0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7400: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7410: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7420: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7430: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7440: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7450: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7460: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7470: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7480: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7490: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
74a0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
74b0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
74c0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
74d0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
74e0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
74f0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7500: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7510: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7520: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7530: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7540: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7550: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7560: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7570: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7580: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7590: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
75a0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
75b0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
75c0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
75d0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
75e0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
75f0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
7600: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
7610: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
7620: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7630: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
7640: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
7650: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
7660: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7670: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7680: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
7690: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
76a0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
76b0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
76c0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
76d0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
76e0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
76f0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
7700: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
7710: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7720: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7730: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7740: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7750: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7760: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7770: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
7780: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7790: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
77a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
77b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
77c0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
77d0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
77e0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
77f0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
7800: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
7810: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
7820: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
7830: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
7840: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7850: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
7860: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7870: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
7880: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
7890: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
78a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
78b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
78c0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
78d0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
78e0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
78f0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
7900: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7910: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7920: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7930: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7940: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7950: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7960: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7970: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7980: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7990: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
79a0: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
79b0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
79c0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
79d0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
79e0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
79f0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
7a00: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7a10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
7a20: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
7a30: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
7a40: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7a50: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
7a60: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
7a70: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
7a80: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
7a90: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
7aa0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
7ab0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
7ac0: 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29  dCellv2(D,M,O,I)
7ad0: 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28   (D+(M&get2byte(
7ae0: 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a  D+(O+2*(I)))))..
7af0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
7b00: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
7b10: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
7b20: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
7b30: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
7b40: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
7b50: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
7b60: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
7b70: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
7b80: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7b90: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
7ba0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7bb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7bc0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
7bd0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
7be0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
7bf0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
7c00: 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65  k;.    k = pPage
7c10: 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->aiOvfl[i];.   
7c20: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
7c30: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
7c40: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
7c50: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f  eturn pPage->apO
7c60: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  vfl[i];.      }.
7c70: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
7c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7c90: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
7ca0: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
7cb0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
7cc0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
7cd0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
7ce0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
7cf0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
7d00: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
7d10: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
7d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
7d30: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
7d40: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
7d50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
7d60: 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  nd btreeParseCel
7d70: 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73  lPtr() .** takes
7d80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7d90: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65  e body of the ce
7da0: 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64  ll as its second
7db0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
7dc0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c   Within this fil
7dd0: 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c  e, the parseCell
7de0: 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20  () macro can be 
7df0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f  called instead o
7e00: 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  f.** btreeParseC
7e10: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
7e20: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
7e30: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
7e40: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
7e50: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e60: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
7e70: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7e80: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7e90: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7ea0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
7eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
7ec0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
7ed0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
7ee0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
7ef0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
7f00: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7f10: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7f30: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
7f40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
7f50: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
7f60: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f80: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7f90: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fa0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fb0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
7fd0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
7fe0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
7ff0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
8000: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
8010: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
8020: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
8030: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
8040: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
8050: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
8060: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
8070: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
8080: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
8090: 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 67  0 );.      n = g
80a0: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
80b0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
80c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
80d0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
80e0: 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  }.    n += getVa
80f0: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  rint(&pCell[n], 
8100: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8110: 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ey);.    pInfo->
8120: 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64  nData = nPayload
8130: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8140: 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b  Info->nData = 0;
8150: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
8160: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
8170: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
8180: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50  pInfo->nKey = nP
8190: 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49  ayload;.  }.  pI
81a0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
81b0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
81c0: 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a  o->nHeader = n;.
81d0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
81e0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
81f0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
8200: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
8210: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8220: 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   );.  if( likely
8230: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
8240: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
8250: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8260: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
8270: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
8280: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
8290: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
82a0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
82b0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
82c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
82d0: 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53    if( (pInfo->nS
82e0: 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50  ize = (u16)(n+nP
82f0: 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e  ayload))<4 ) pIn
8300: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
8310: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8320: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
8330: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8340: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65  erflow = 0;.  }e
8350: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
8360: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8370: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8380: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8390: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
83a0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
83b0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
83c0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
83d0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
83e0: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
83f0: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8400: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
8410: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
8420: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
8430: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
8440: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
8450: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
8460: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
8470: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
8480: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8490: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
84a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
84b0: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
84c0: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
84d0: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
84e0: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
84f0: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
8500: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
8510: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
8520: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
8530: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
8540: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8550: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8560: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
8570: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
8580: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
8590: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
85a0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
85b0: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
85c0: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
85d0: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
85e0: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
85f0: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
8600: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8610: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
8620: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
8630: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
8640: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
8650: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8660: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8670: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
8680: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8690: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
86a0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
86b0: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
86c0: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
86d0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
86e0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
86f0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
8700: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
8710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
8720: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8730: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
8740: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
8750: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
8760: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
8770: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8780: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8790: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
87a0: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
87b0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
87c0: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72  , pInfo) \.  btr
87d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
87e0: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
87f0: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
8800: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61  )), (pInfo)).sta
8810: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
8820: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
8830: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
8840: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
8850: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
8860: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8880: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
8890: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
88a0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
88b0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
88c0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
88d0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
88e0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
88f0: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
8900: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8910: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
8920: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
8930: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
8940: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
8950: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
8960: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
8970: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
8980: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
8990: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
89a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
89b0: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
89c0: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
89d0: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
89e0: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
89f0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8a00: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
8a10: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8a20: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
8a30: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
8a40: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
8a50: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
8a60: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
8a70: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
8a80: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
8a90: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
8aa0: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
8ab0: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
8ac0: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
8ad0: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
8ae0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
8af0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
8b00: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
8b10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
8b20: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
8b30: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
8b40: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
8b50: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
8b60: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
8b70: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
8b80: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
8b90: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
8ba0: 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
8bb0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
8bc0: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
8bd0: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
8be0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
8bf0: 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20     u8 *pEnd;.   
8c00: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
8c10: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ata ){.      pIt
8c20: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
8c30: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
8c40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8c50: 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20    nSize = 0;.   
8c60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72   }..    /* pIter
8c70: 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74   now points at t
8c80: 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  he 64-bit intege
8c90: 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76  r key value, a v
8ca0: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a  ariable length .
8cb0: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
8cc0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
8cd0: 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20  ock moves pIter 
8ce0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
8cf0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a  first byte.    *
8d00: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
8d10: 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  f the key value.
8d20: 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   */.    pEnd = &
8d30: 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68  pIter[9];.    wh
8d40: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
8d50: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
8d60: 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nd );.  }else{. 
8d70: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
8d80: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
8d90: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65  Size);.  }..  te
8da0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8db0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8dc0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
8dd0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8de0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8df0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
8e00: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
8e10: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
8e20: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
8e30: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8e40: 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e  l + (nSize - min
8e50: 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d  Local) % (pPage-
8e60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8e70: 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
8e80: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8e90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8ea0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
8eb0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8ec0: 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  cal+1 );.    if(
8ed0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
8ee0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8ef0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a  ;.    }.    nSiz
8f10: 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53  e += 4;.  }.  nS
8f20: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
8f30: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20  er - pCell);..  
8f40: 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  /* The minimum s
8f50: 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20  ize of any cell 
8f60: 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  is 4 bytes. */. 
8f70: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a   if( nSize<4 ){.
8f80: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20      nSize = 4;. 
8f90: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53   }..  assert( nS
8fa0: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
8fb0: 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e  Size );.  return
8fc0: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a   (u16)nSize;.}..
8fd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8fe0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
8ff0: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
9000: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
9010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
9020: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
9030: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
9040: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
9050: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9060: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
9070: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  n cellSizePtr(pP
9080: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
9090: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
90a0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
90b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
90c0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
90d0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
90e0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
90f0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
9100: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
9110: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
9120: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
9130: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
9140: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
9150: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
9160: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
9170: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
9180: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9190: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
91a0: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
91b0: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
91c0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
91d0: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
91e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
91f0: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
9200: 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
9210: 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
9220: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
9230: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
9240: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
9250: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
9260: 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ow ){.    Pgno o
9270: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
9280: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
9290: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d  flow]);.    ptrm
92a0: 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
92b0: 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  , ovfl, PTRMAP_O
92c0: 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
92d0: 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d  >pgno, pRC);.  }
92e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
92f0: 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65  * Defragment the
9300: 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c   page given.  Al
9310: 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65  l Cells are move
9320: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  d to the.** end 
9330: 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  of the page and 
9340: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69  all free space i
9350: 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  s collected into
9360: 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65   one.** big Free
9370: 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20  Blk that occurs 
9380: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68  in between the h
9390: 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a  eader and cell.*
93a0: 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  * pointer array 
93b0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
93c0: 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74  tent area..*/.st
93d0: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
93e0: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
93f0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
9400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9410: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9420: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
9430: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9440: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
9450: 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20   of a i-th cell 
9460: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9490: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
94a0: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
94d0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
94e0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
94f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
9500: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
9510: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
9520: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
9530: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
9540: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9550: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
9560: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
9570: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9580: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
9590: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
95a0: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
95b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
95c0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
95d0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
95e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
95f0: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
9600: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
9610: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
9620: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
9630: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
9640: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
9650: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
9660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9670: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
9680: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
9690: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
96a0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
96b0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
96c0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
96d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
96e0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
96f0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9700: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9710: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9720: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9730: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
9740: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
9750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9760: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9780: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9790: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
97a0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
97b0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
97c0: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
97d0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74  ->pPager);.  dat
97e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
97f0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
9800: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
9810: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
9820: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
9830: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
9840: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
9850: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
9860: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
9870: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
9880: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9890: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
98a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
98b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
98c0: 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26  y(&temp[cbrk], &
98d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62  data[cbrk], usab
98e0: 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a  leSize - cbrk);.
98f0: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
9900: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
9910: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
9920: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
9930: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
9940: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
9950: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
9960: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
9970: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
9980: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
9990: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
99a0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
99b0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
99c0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
99d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
99e0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
99f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9a00: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23  ==iCellLast );.#
9a10: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9a20: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9a30: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9a40: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
9a50: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
9a60: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
9a70: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
9a80: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
9a90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9aa0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9ab0: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
9ac0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9ad0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9ae0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9af0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9b10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9b20: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
9b30: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
9b40: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
9b50: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
9b60: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
9b70: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
9b80: 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e   size;.#if defin
9b90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9ba0: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
9bb0: 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62  HECK).    if( cb
9bc0: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  rk<iCellFirst ){
9bd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9be0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9bf0: 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
9c00: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9c10: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
9c20: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
9c30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9c40: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9c50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9c60: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
9c70: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
9c80: 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46   && cbrk>=iCellF
9c90: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
9ca0: 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d  case( cbrk+size=
9cb0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9cc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
9cd0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9ce0: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
9cf0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d  data[cbrk], &tem
9d00: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
9d10: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
9d20: 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  , cbrk);.  }.  a
9d30: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65  ssert( cbrk>=iCe
9d40: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74  llFirst );.  put
9d50: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9d60: 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74  5], cbrk);.  dat
9d70: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
9d80: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
9d90: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
9da0: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
9db0: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
9dc0: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
9dd0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
9de0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9df0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9e00: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
9e10: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
9e20: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
9e30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9e40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9e50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9e60: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e70: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
9e80: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
9e90: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
9ea0: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
9eb0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
9ec0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
9ed0: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
9ee0: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
9ef0: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
9f00: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
9f10: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
9f20: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
9f30: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
9f40: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
9f50: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
9f60: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
9f70: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
9f80: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
9f90: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
9fa0: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
9fb0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
9fc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
9fd0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
9fe0: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
9ff0: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
a000: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
a010: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
a020: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
a030: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
a040: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
a050: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
a060: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
a070: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
a080: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
a090: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
a0a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
a0b0: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
a0c0: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
a0d0: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
a0e0: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
a0f0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
a100: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
a110: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a120: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
a130: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
a140: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
a150: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
a160: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
a170: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
a180: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
a190: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
a1a0: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
a1b0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
a1c0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
a1d0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
a1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1f0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
a200: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
a210: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a220: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
a230: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
a240: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
a250: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
a260: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
a270: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
a280: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
a290: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
a2a0: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
a2b0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
a2c0: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
a2d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
a2e0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
a2f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
a300: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a310: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
a320: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a330: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a340: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a350: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
a360: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
a370: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
a3a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a3b0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
a3c0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
a3d0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
a3e0: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
a3f0: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
a400: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 61 73  eSize-8 );..  as
a410: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c  sert( pPage->cel
a420: 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b  lOffset == hdr +
a430: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
a440: 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70  eaf );.  gap = p
a450: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a460: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
a470: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70  l;.  assert( gap
a480: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 74 6f 70  <=65536 );.  top
a490: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a4a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
a4b0: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
a4c0: 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b 0a 20 20  if( top==0 ){.  
a4d0: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
a4e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a4f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a500: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a510: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
a520: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
a530: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
a540: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
a550: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
a560: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
a570: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
a580: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
a590: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
a5a0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
a5b0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
a5c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
a5d0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
a5e0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
a5f0: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
a600: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
a610: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
a620: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
a630: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
a640: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
a650: 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20 28 64  gap+2<=top && (d
a660: 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20 64 61  ata[hdr+1] || da
a670: 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a 20 20  ta[hdr+2]) ){.  
a680: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
a690: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
a6a0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
a6b0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a6c0: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
a6d0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
a6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a6f0: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
a700: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
a710: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
a720: 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20  | pc<addr+4 ){. 
a730: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
a740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a750: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
a760: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
a770: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
a780: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
a790: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
a7a0: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
a7b0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65  Byte;.        te
a7c0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
a7d0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
a7e0: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
a7f0: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a800: 20 20 20 20 20 20 20 69 66 28 20 64 61 74 61 5b         if( data[
a810: 68 64 72 2b 37 5d 3e 3d 36 30 20 29 20 67 6f 74  hdr+7]>=60 ) got
a820: 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67  o defragment_pag
a830: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;.          /* 
a840: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
a850: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
a860: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
a870: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
a880: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
a890: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
a8a0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
a8b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
a8c0: 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70  a[addr], &data[p
a8d0: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
a8e0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d    data[hdr+7] +=
a8f0: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 20 20   (u8)x;.        
a900: 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70  }else if( size+p
a910: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
a920: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
a930: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a940: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
a950: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a960: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
a970: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
a980: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
a990: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
a9a0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  t.          ** f
a9b0: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
a9c0: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
a9d0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
a9e0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
a9f0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  (&data[pc+2], x)
aa00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aa10: 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b      *pIdx = pc +
aa20: 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   x;.        retu
aa30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
aa40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aa50: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
aa60: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
aa70: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
aa80: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
aa90: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
aaa0: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
aab0: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
aac0: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
aad0: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
aae0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
aaf0: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
ab00: 7b 0a 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67  {.defragment_pag
ab10: 65 3a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e:.    testcase(
ab20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
ab30: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   );.    rc = def
ab40: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
ab50: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
ab60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
ab70: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
ab80: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
ab90: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
aba0: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
abb0: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
abc0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
abd0: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
abe0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
abf0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
ac00: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
ac10: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
ac20: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
ac30: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
ac40: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
ac50: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
ac60: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
ac70: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
ac80: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
ac90: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
aca0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
acb0: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
acc0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
acd0: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
ace0: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
acf0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
ad00: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
ad10: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
ad20: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ad30: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
ad40: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
ad50: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
ad60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
ad70: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
ad80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ad90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ada0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
adb0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
adc0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
add0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
ade0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
adf0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
ae00: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
ae10: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
ae20: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
ae30: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
ae40: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
ae50: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
ae60: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
ae70: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
ae80: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ae90: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
aea0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
aeb0: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
aec0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
aed0: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
aee0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
aef0: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
af00: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
af10: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
af20: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
af30: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
af40: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
af50: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
af60: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
af70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
af80: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
af90: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
afa0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
afb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
afc0: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
afd0: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
afe0: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
aff0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b000: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
b010: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
b020: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b050: 70 6f 69 6e 74 65 72 20 74 6f 20 6e 65 78 74 20  pointer to next 
b060: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
b070: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b0a0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
b0b0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
b0c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
b0f0: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
b100: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
b110: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b130: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
b140: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
b150: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
b160: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b170: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
b180: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
b190: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
b1a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b1b0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
b1c0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
b1d0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b1e0: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
b1f0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
b200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b210: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
b220: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
b230: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b240: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
b250: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
b260: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
b270: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b280: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
b290: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b2a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b2b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b2c0: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
b2d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b2e0: 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
b2f0: 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  trSize );.  asse
b300: 72 74 28 20 69 45 6e 64 20 3c 3d 20 70 50 61 67  rt( iEnd <= pPag
b310: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b320: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
b330: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b340: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b350: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b360: 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
b370: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
b380: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
b390: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
b3a0: 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f  iLast );..  /* O
b3b0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
b3c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
b3d0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
b3e0: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
b3f0: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
b400: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  abled */.  if( p
b410: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
b420: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
b430: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
b440: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61  emset(&data[iSta
b450: 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a  rt], 0, iSize);.
b460: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69    }..  /* The li
b470: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
b480: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
b490: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69  nding order.  Fi
b4a0: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f  nd the .  ** spo
b4b0: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68  t on the list wh
b4c0: 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c  ere iStart shoul
b4d0: 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20  d be inserted.. 
b4e0: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
b4f0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b500: 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  iPtr = hdr + 1;.
b510: 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b    if( data[iPtr+
b520: 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50  1]==0 && data[iP
b530: 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46  tr]==0 ){.    iF
b540: 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20  reeBlk = 0;  /* 
b550: 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
b560: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66   case when the f
b570: 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
b580: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b590: 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c   while( (iFreeBl
b5a0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
b5b0: 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20  ta[iPtr]))>0 && 
b5c0: 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20  iFreeBlk<iStart 
b5d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
b5e0: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72  eeBlk<iPtr+4 ) r
b5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b600: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b610: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
b620: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b630: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
b640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b650: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b660: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
b670: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
b680: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
b690: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
b6a0: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
b6b0: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
b6c0: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
b6d0: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
b6e0: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
b6f0: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
b700: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
b710: 6e 74 65 72 20 69 46 72 65 65 42 6c 6b 0a 20 20  nter iFreeBlk.  
b720: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
b730: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65  k to see if iFre
b740: 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63  eBlk should be c
b750: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
b760: 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e  e end of iStart.
b770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b780: 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64  iFreeBlk && iEnd
b790: 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a  +3>=iFreeBlk ){.
b7a0: 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46        nFrag = iF
b7b0: 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20  reeBlk - iEnd;. 
b7c0: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46       if( iEnd>iF
b7d0: 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20  reeBlk ) return 
b7e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b7f0: 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  KPT;.      iEnd 
b800: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
b810: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b820: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
b830: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
b840: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
b850: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
b860: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
b870: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
b880: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
b890: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
b8a0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
b8b0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
b8c0: 65 6c 69 73 74 20 70 6f 69 6e 74 65 72 0a 20 20  elist pointer.  
b8d0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65    ** in the page
b8e0: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
b8f0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
b900: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 63  tart should be c
b910: 6f 61 6c 65 73 63 65 64 20 0a 20 20 20 20 2a 2a  oalesced .    **
b920: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
b930: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
b940: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
b950: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
b960: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
b970: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
b980: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
b990: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
b9a0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
b9b0: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
b9c0: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
b9d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b9e0: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
b9f0: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
ba00: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
ba10: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
ba20: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
ba30: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
ba40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
ba50: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
ba60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ba70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
ba80: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
ba90: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
baa0: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
bab0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
bac0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
bad0: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
bae0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
baf0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
bb00: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
bb10: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
bb20: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
bb30: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
bb40: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
bb50: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
bb60: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
bb70: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
bb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bb90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bba0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
bbb0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
bbc0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
bbd0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
bbe0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
bbf0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
bc00: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
bc10: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
bc20: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
bc30: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
bc40: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
bc50: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
bc60: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
bc70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
bc80: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
bc90: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
bca0: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
bcb0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
bcc0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bcd0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
bce0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
bcf0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
bd00: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
bd10: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
bd20: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
bd30: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
bd40: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
bd50: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
bd60: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
bd70: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
bd80: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
bd90: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
bda0: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
bdb0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
bdc0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
bdd0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
bde0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
bdf0: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
be00: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
be10: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
be20: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
be30: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
be40: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
be50: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
be60: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
be70: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
be80: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
be90: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
bea0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
beb0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
bec0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
bed0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
bee0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
bef0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
bf00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bf10: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
bf20: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
bf30: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
bf40: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
bf50: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
bf60: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
bf70: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
bf80: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
bf90: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
bfa0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
bfb0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bfc0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
bfd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
bfe0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
bff0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
c000: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
c010: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
c020: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
c030: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
c040: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
c050: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
c060: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
c070: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
c080: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
c090: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
c0a0: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
c0b0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
c0c0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
c0d0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
c0e0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
c0f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
c100: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
c110: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
c120: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c130: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
c140: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
c150: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
c160: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
c170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c180: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c190: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
c1a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
c1b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
c1c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
c1d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
c1e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
c1f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
c200: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
c210: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
c220: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
c230: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
c240: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
c250: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
c260: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
c270: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
c280: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
c290: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
c2a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
c2b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
c2c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
c2d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
c2e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
c2f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
c300: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
c310: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
c320: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c330: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c340: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c350: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c360: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
c370: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c380: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c390: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
c3a0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
c3b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c3c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c3d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c3e0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
c3f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c400: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c410: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
c420: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
c430: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
c440: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
c450: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
c460: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
c470: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
c480: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
c490: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
c4a0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
c4b0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
c4c0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
c4d0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
c4e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
c4f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c500: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
c510: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
c520: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
c530: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
c540: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
c550: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
c560: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
c570: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
c580: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
c590: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
c5a0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
c5b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
c5c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
c5d0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
c5e0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
c5f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
c600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c610: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
c620: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c630: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
c640: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
c650: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
c660: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
c670: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
c680: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
c690: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
c6a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
c6b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
c6c0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
c6d0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
c6e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c6f0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
c700: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
c710: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
c720: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
c730: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c740: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c750: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
c760: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
c770: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
c780: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
c790: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
c7a0: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
c7b0: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
c7c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c7d0: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
c7e0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
c7f0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
c800: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
c810: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
c820: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
c830: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
c840: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
c850: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
c860: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
c870: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c880: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
c890: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
c8a0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
c8b0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
c8c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c8d0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
c8e0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
c8f0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
c900: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
c910: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
c920: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
c930: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
c940: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
c950: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c960: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c970: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
c980: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
c990: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
c9a0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
c9b0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
c9c0: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
c9d0: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
c9e0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
c9f0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
ca00: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
ca10: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
ca20: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
ca30: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
ca40: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
ca50: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
ca60: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
ca70: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
ca80: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
ca90: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
caa0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
cab0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
cac0: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
cad0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
cae0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
caf0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
cb00: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
cb10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
cb20: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
cb30: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
cb40: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cb60: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
cb70: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
cb80: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
cb90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
cba0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
cbb0: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
cbc0: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
cbd0: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
cbe0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
cbf0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
cc00: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
cc10: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
cc20: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
cc30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
cc40: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
cc50: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
cc60: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
cc70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
cc80: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
cc90: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
cca0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ccb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ccc0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
ccd0: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
cce0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
ccf0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
cd00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
cd10: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
cd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
cd30: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
cd40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
cd50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
cd60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
cd70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
cd80: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
cd90: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
cda0: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
cdb0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
cdc0: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
cdd0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
cde0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
cdf0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
ce00: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
ce10: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
ce20: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
ce30: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
ce40: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
ce50: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
ce60: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
ce70: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
ce80: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
ce90: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
cea0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
ceb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cec0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
ced0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
cee0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cef0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
cf00: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
cf10: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
cf20: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
cf30: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
cf40: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
cf50: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
cf60: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
cf70: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
cf80: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
cf90: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
cfa0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
cfb0: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73  e free-block mus
cfc0: 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74  t lie on the dat
cfd0: 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a  abase page.  */.
cfe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
cff0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d000: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
d010: 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
d020: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70   + size;.      p
d030: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
d040: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
d050: 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
d060: 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
d070: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d080: 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  he start.    ** 
d090: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
d0a0: 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
d0b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
d0c0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
d0d0: 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
d0e0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
d0f0: 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
d100: 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
d110: 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ize.    ** of th
d120: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
d130: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
d140: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
d150: 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  eck also.    ** 
d160: 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
d170: 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
d180: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
d190: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
d1a0: 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61  t.    ** area, a
d1b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
d1c0: 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
d1d0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
d1e0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
d1f0: 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
d200: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
d210: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d220: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
d230: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
d240: 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20  = (u16)(nFree - 
d250: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20  iCellFirst);.   
d260: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
d270: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
d280: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d290: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
d2a0: 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
d2b0: 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
d2c0: 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
d2d0: 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
d2e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
d2f0: 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
d300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
d310: 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
d320: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
d330: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
d340: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
d350: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
d360: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d370: 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66  rOffset;.  u16 f
d380: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
d390: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d3a0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
d3b0: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
d3c0: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
d3d0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
d3e0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
d3f0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
d400: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
d410: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d420: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
d430: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
d440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d450: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
d460: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
d470: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
d480: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d490: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d4a0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62   );.  if( pBt->b
d4b0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
d4c0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
d4d0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
d4e0: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
d4f0: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
d500: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d  .  }.  data[hdr]
d510: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
d520: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
d530: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
d540: 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a  )==0 ? 12 : 8);.
d550: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
d560: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
d570: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
d580: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
d590: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
d5a0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
d5b0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
d5c0: 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
d5d0: 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64  ze - first);.  d
d5e0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
d5f0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
d600: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
d610: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
d620: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
d630: 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
d640: 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
d650: 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72  lIdx = &data[fir
d660: 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  st];.  pPage->nO
d670: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
d680: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
d690: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
d6a0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
d6b0: 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
d6c0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
d6d0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
d6e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
d6f0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
d700: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
d710: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
d720: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
d730: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
d740: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
d750: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
d760: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
d770: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
d780: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d790: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
d7a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
d7b0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
d7c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
d7d0: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
d7e0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d7f0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
d800: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
d810: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
d820: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
d830: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
d840: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
d850: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
d860: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
d870: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d880: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
d890: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
d8a0: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
d8b0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d8c0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d8d0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
d8e0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
d8f0: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
d900: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
d910: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
d920: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
d930: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
d940: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
d950: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
d960: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
d970: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
d980: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
d990: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
d9a0: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
d9b0: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
d9c0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
d9d0: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
d9e0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
d9f0: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
da00: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
da10: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
da20: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
da30: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
da40: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
da50: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
da60: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
da70: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
da80: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
da90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
daa0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
dab0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
dac0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
dad0: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
dae0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
daf0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
db00: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
db10: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
db20: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
db30: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
db40: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
db50: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
db60: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
db70: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
db80: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
db90: 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
dba0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
dbb0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
dbc0: 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
dbd0: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
dbe0: 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
dbf0: 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
dc00: 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
dc10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dc20: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
dc30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
dc40: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
dc50: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
dc60: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
dc70: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
dc80: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
dc90: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
dca0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
dcb0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
dcc0: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
dcd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dce0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
dcf0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
dd00: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
dd10: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
dd20: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
dd30: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
dd40: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
dd50: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
dd60: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
dd70: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
dd80: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
dd90: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
dda0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
ddb0: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
ddc0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
ddd0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
dde0: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
ddf0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
de00: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
de10: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
de20: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
de30: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
de40: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
de50: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
de60: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
de70: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
de80: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
de90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
dea0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
deb0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
dec0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
ded0: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
dee0: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
def0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
df00: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
df10: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
df20: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
df30: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
df40: 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
df50: 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
df60: 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
df70: 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
df80: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
df90: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
dfa0: 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
dfb0: 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
dfc0: 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
dfd0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
dfe0: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
dff0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
e000: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
e010: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
e020: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
e030: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
e040: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
e050: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
e060: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
e070: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
e080: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
e090: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
e0a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
e0b0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
e0c0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
e0d0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
e0e0: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
e0f0: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
e100: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
e110: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
e120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
e130: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
e140: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e160: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
e170: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
e180: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
e190: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e1a0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
e1b0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
e1c0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
e1d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
e1e0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
e1f0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  nter here */.  i
e200: 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20  nt bReadonly    
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  * PAGER_GET_READ
e230: 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a  ONLY or 0 */.){.
e240: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
e250: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e260: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e270: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e280: 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52  bReadonly==PAGER
e290: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c  _GET_READONLY ||
e2a0: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b   bReadonly==0 );
e2b0: 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
e2c0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
e2d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e2e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e2f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
e300: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
e310: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
e320: 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a  ge, bReadonly);.
e330: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e340: 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67  TE_OK && (*ppPag
e350: 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
e360: 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
e370: 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
e380: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
e390: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e3a0: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
e3b0: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
e3c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
e3d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
e3e0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
e3f0: 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
e400: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
e410: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e420: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
e430: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
e440: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
e450: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
e460: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
e470: 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
e480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
e490: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
e4a0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
e4b0: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
e4c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e4d0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
e4e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
e4f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
e500: 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
e510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
e520: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
e530: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e540: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
e550: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
e560: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e570: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
e580: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
e590: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
e5a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e5b0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e5c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
e5d0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
e5e0: 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
e5f0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
e600: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
e610: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
e620: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
e630: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
e640: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
e650: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
e660: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
e670: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
e680: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
e690: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
e6a0: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
e6b0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
e6c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e6d0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
e6e0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
e6f0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
e700: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
e710: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
e720: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
e730: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
e740: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
e750: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
e760: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
e770: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
e780: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
e790: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
e7a0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
e7b0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
e7c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
e7d0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
e7e0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
e7f0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
e800: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e810: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e820: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e830: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
e840: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
e850: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
e860: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
e870: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
e880: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
e890: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
e8a0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
e8b0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
e8c0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
e8d0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
e8e0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
e8f0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
e900: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
e910: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
e920: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
e930: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
e940: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
e950: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
e960: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
e970: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
e980: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
e990: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
e9a0: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
e9b0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
e9c0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
e9d0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
e9e0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
e9f0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
ea00: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
ea10: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
ea20: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
ea30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ea40: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
ea50: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
ea60: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
ea70: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
ea80: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
ea90: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
eaa0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
eab0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
eac0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
ead0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eae0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
eaf0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
eb00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
eb10: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
eb20: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
eb30: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
eb40: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
eb50: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
eb60: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
eb70: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
eb80: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
eb90: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
eba0: 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
ebb0: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
ebc0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
ebd0: 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
ebe0: 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
ebf0: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
ec00: 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
ec10: 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
ec20: 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
ec30: 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
ec40: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
ec50: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
ec60: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
ec70: 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
ec80: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ec90: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
eca0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
ecb0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
ecc0: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
ecd0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
ece0: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
ecf0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
ed00: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
ed10: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
ed20: 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
ed30: 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
ed40: 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
ed50: 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
ed60: 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
ed70: 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
ed80: 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
ed90: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
eda0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
edb0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
edc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
edd0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
ede0: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
edf0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
ee00: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
ee10: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
ee20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
ee30: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
ee40: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
ee50: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
ee60: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
ee70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ee80: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
ee90: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
eea0: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
eeb0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
eec0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
eed0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
eee0: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
eef0: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
ef00: 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
ef10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ef20: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
ef30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
ef40: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
ef50: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
ef60: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
ef70: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
ef80: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
ef90: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
efa0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
efb0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
efc0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
efd0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
efe0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f000: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
f010: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
f020: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
f030: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
f040: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
f050: 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
f060: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
f070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
f080: 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
f090: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
f0a0: 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
f0d0: 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
f0e0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
f0f0: 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
f100: 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
f110: 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
f120: 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
f130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f140: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
f150: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
f160: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
f170: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f190: 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
f1a0: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
f1b0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
f1c0: 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
f1d0: 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
f1e0: 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
f1f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
f200: 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
f210: 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
f220: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
f230: 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
f240: 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
f250: 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
f260: 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
f270: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
f280: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
f290: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
f2a0: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
f2b0: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
f2c0: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
f2d0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
f2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
f2f0: 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
f300: 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
f310: 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
f320: 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
f330: 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
f340: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
f350: 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
f370: 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
f380: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
f390: 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
f3b0: 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
f3c0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
f3d0: 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
f3e0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
f3f0: 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
f400: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f410: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f420: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
f430: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
f440: 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
f450: 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
f460: 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
f470: 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
f480: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
f490: 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
f4a0: 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
f4b0: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
f4c0: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
f4d0: 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
f4e0: 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
f4f0: 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
f500: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
f510: 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
f520: 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
f530: 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
f540: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
f550: 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
f560: 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
f570: 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
f580: 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
f590: 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
f5a0: 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
f5b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
f5c0: 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
f5d0: 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
f5e0: 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
f5f0: 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
f600: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
f610: 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
f620: 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
f630: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
f640: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
f650: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
f660: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f670: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f680: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
f690: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
f6a0: 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
f6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f6c0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
f6d0: 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
f6e0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
f6f0: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
f700: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f710: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f720: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f730: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f740: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
f750: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
f760: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
f770: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
f780: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
f790: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
f7a0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
f7b0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
f7c0: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
f7d0: 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
f7e0: 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
f7f0: 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
f800: 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
f810: 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
f820: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
f830: 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
f840: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
f850: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
f860: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
f870: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
f880: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
f890: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
f8a0: 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  e);.      MUTEX_
f8b0: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
f8c0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
f8d0: 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73 68  d; ).      p->sh
f8e0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f8f0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
f900: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
f910: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f930: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f950: 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
f960: 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
f970: 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
f980: 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
f990: 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
f9a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f9b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f9c0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
f9d0: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
f9e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
fa10: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
fa20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
fa30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
fa40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fa50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fa60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fa70: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
fa80: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fa90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
faa0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
fab0: 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
fac0: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
fad0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fae0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
faf0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
fb00: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fb10: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
fb20: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
fb30: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
fb40: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
fb50: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
fb60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fb70: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
fb80: 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
fb90: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
fba0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fbb0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fbc0: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
fbd0: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
fbe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
fbf0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
fc00: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
fc10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
fc20: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
fc30: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
fc40: 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
fc50: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
fc60: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
fc70: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
fc80: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
fc90: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
fca0: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
fcb0: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
fcd0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
fce0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
fcf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
fd00: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
fd10: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
fd20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
fd30: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
fd40: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
fd50: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
fd60: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
fd70: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
fd80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
fd90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
fda0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
fdc0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
fdd0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
fde0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
fdf0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
fe00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
fe10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
fe20: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
fe30: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
fe40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fe50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fe60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
fe70: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
fe80: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
fe90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
fea0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
feb0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
fec0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
fed0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
fee0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
fef0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
ff00: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
ff10: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ff20: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ff30: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ff40: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ff50: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ff60: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ff70: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ff80: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
ff90: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ffa0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ffb0: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
ffc0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
ffd0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
ffe0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
fff0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
10000 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
10010 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
10020 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
10030 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
10040 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
10050 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
10060 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
10070 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
10080 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
10090 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
100a0 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
100b0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
100c0 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
100d0 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
100e0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
100f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
10100 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
10110 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
10120 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
10130 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
10140 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
10150 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
10160 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
10170 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
10180 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
10190 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
101a0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
101b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
101c0 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
101d0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
101e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
101f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10200 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
10210 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10220 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
10230 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
10240 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
10250 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
10280 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
10290 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
102a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
102b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
102c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
102d0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
102e0 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
102f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10300 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
10310 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
10320 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
10330 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
10340 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
10350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10360 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10370 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
10380 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
10390 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
103a0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
103b0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
103c0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
103d0 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
103e0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
103f0 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
10400 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
10410 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
10420 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
10430 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
10440 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
10450 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
10460 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
10470 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
10480 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
10490 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
104a0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
104b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
104c0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
104d0 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
104e0 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
104f0 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
10500 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
10510 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
10520 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
10530 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
10540 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10550 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
10560 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
10570 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
10580 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
10590 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
105a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
105b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
105c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
105d0 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
105e0 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
105f0 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
10600 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
10610 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
10620 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
10630 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
10640 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
10650 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
10660 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
10670 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
10680 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
10690 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
106a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
106b0 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
106c0 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
106d0 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
106e0 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
106f0 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
10700 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
10710 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
10720 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
10730 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10740 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
10750 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
10760 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
10770 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
10780 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
10790 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
107a0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
107b0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
107c0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
107d0 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
107e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
107f0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
10800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10810 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
10820 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
10830 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
10840 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
10850 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
10860 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10870 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
10880 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
10890 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
108a0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
108b0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
108c0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
108d0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
108e0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
108f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
10900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10910 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10920 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
10930 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
10940 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
10950 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
10960 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
10970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
10980 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
10990 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
109a0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
109b0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
109c0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
109d0 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
109e0 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
109f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10a00 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
10a10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10a20 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
10a30 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
10a40 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10a50 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
10a60 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
10a70 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
10a80 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
10a90 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
10aa0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10ab0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
10ac0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
10ad0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
10ae0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
10af0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
10b00 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10b10 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10b20 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
10b30 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
10b40 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
10b50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
10b60 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
10b70 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
10b80 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10b90 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10ba0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
10bb0 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
10bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10be0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
10bf0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
10c00 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
10c10 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10c30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
10c40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
10c50 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
10c60 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
10c70 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10c80 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10c90 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
10ca0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10cb0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10cc0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
10cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10ce0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
10cf0 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
10d00 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
10d10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10d20 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
10d30 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
10d40 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10d50 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
10d60 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
10d70 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
10d80 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
10d90 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
10da0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
10db0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
10dc0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
10dd0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
10de0 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
10df0 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10e00 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
10e10 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
10e20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
10e30 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
10e40 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
10e50 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10e60 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
10e70 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
10e80 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
10e90 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
10ea0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
10eb0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
10ec0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
10ed0 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
10ee0 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
10ef0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
10f00 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
10f10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
10f20 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
10f30 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
10f40 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
10f50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
10f60 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
10f70 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
10f80 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
10f90 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
10fa0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
10fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10fc0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
10fd0 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
10fe0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
10ff0 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
11000 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
11010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
11020 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
11030 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
11040 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
11050 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
11060 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
11070 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
11080 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
11090 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
110a0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
110b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
110d0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
110e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
110f0 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11100 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
11110 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11120 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
11130 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
11140 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
11150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
11160 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
11170 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
11180 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
11190 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
111a0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
111b0 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
111c0 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
111d0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
111e0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
111f0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
11200 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
11210 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
11220 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
11230 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
11240 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
11250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
11260 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11270 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
11280 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
11290 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
112a0 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
112b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
112c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
112d0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
112e0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
112f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
11300 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
11310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11320 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
11330 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
11340 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
11350 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
11360 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
11370 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
11380 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
11390 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
113a0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
113b0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
113c0 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
113d0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
113e0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
113f0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
11400 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
11410 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
11420 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
11430 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11440 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
11450 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
11460 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
11470 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
11480 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
11490 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
114a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
114b0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
114c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
114d0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
114e0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
114f0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
11500 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
11510 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
11520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11530 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
11540 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
11550 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
11560 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
11570 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
11580 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11590 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
115a0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
115b0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
115c0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
115d0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
115e0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
115f0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11600 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11610 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
11620 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
11630 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
11640 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
11650 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
11660 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
11670 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
11680 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
11690 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
116a0 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
116b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
116c0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
116d0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
116e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
116f0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
11700 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
11710 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
11720 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11730 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
11740 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
11750 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
11760 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
11770 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
11780 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
11790 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
117a0 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
117b0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a  IZE(pBt) bytes..
117c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
117d0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
117e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
117f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
11800 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
11810 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
11820 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
11830 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
11840 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
11850 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
11860 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
11870 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
11880 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
11890 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
118a0 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
118b0 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
118c0 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
118d0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
118e0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
118f0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
11900 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
11910 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
11920 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
11930 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
11940 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
11950 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
11960 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
11970 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
11980 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
11990 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
119a0 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
119b0 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
119c0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
119d0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
119e0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
119f0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
11a00 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
11a10 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
11a20 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
11a30 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
11a40 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
11a50 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
11a60 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
11a70 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
11a80 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
11a90 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
11aa0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
11ab0 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
11ac0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
11ad0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
11ae0 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69   here.  */.    i
11af0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
11b00 65 20 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e  e ) memset(pBt->
11b10 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29  pTmpSpace, 0, 4)
11b20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
11b30 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
11b40 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
11b50 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
11b60 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
11b70 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11b80 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
11b90 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
11ba0 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
11bb0 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
11bc0 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
11bd0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
11be0 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
11bf0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
11c00 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
11c10 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
11c20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11c30 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
11c40 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
11c50 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
11c60 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
11c70 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
11c80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11c90 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11ca0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11cb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11cc0 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
11cd0 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
11ce0 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
11cf0 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
11d00 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
11d10 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
11d20 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
11d30 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
11d40 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
11d50 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
11d60 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
11d70 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
11d80 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
11d90 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
11da0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
11db0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11dc0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
11dd0 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
11de0 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
11df0 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
11e00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
11e10 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
11e20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
11e30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11e40 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11e50 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
11e60 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
11e70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
11e80 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
11e90 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
11ea0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
11eb0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
11ec0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
11ed0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
11ee0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
11ef0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
11f00 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
11f10 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
11f20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
11f30 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
11f40 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
11f50 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
11f60 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
11f70 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
11f80 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
11f90 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
11fa0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
11fb0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
11fc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
11fd0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
11fe0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
11ff0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
12000 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
12010 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
12020 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
12030 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
12040 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (p->db->flags & 
12050 53 51 4c 49 54 45 5f 4f 74 61 4d 6f 64 65 29 21  SQLITE_OtaMode)!
12060 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  =0);.    if( pBt
12070 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
12080 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
12090 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
120a0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
120b0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
120c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
120d0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
120e0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
120f0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
12100 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
12110 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
12120 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12130 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
12140 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
12150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12160 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
12170 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
12180 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
12190 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
121a0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
121b0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
121c0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
121d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
121e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
121f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12200 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
12210 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
12220 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
12230 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
12240 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
12250 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
12260 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
12270 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
12280 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
12290 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
122a0 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
122b0 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
122c0 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
122d0 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
122e0 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
122f0 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
12300 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
12310 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
12320 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
12330 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
12340 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
12350 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
12360 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
12370 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
12380 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
12390 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
123a0 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
123b0 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
123c0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
123d0 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
123e0 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
123f0 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
12400 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
12410 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
12420 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
12430 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
12440 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
12450 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
12460 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
12470 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
12480 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
12490 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
124a0 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
124b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
124c0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
124d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
124e0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
124f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12500 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12510 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12520 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12530 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12540 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
12550 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
12560 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12570 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
12580 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12590 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
125a0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
125b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
125c0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
125d0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
125e0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
125f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
12600 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
12610 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
12620 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12630 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
12640 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
12650 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
12660 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
12670 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
12680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12690 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
126a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
126b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
126c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
126d0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
126e0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
126f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12700 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12710 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
12720 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
12730 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
12740 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12750 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
12760 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
12770 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
12780 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
12790 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
127a0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
127b0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
127c0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
127d0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
127e0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
127f0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
12800 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
12810 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
12820 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
12830 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
12840 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
12850 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
12860 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
12870 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
12880 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
12890 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
128a0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
128b0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
128c0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
128d0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
128e0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
128f0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
12900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12910 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
12920 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12930 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
12940 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
12950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
12960 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
12970 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
12980 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
12990 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
129a0 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
129b0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
129c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
129d0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
129e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
129f0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
12a00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12a10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
12a20 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
12a30 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
12a40 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
12a50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12a60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12a70 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
12a80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
12a90 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
12aa0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
12ab0 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
12ac0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
12ad0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
12ae0 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
12af0 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
12b00 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
12b10 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
12b20 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
12b30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12b40 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
12b50 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
12b60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12b70 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
12b80 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
12b90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
12ba0 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
12bb0 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
12bc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
12bd0 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
12be0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
12bf0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12c10 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
12c20 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
12c30 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
12c40 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
12c50 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
12c60 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
12c70 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
12c80 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
12c90 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
12ca0 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
12cb0 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
12cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
12cd0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
12ce0 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
12cf0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
12d00 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
12d10 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
12d20 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
12d30 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
12d40 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
12d50 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
12d60 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
12d70 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
12d80 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
12d90 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
12da0 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
12db0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12dc0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
12dd0 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
12de0 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
12df0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
12e00 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
12e10 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
12e20 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
12e30 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
12e40 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
12e50 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
12e60 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
12e70 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
12e80 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
12e90 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
12ea0 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
12eb0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
12ec0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
12ed0 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
12ee0 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
12ef0 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
12f00 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
12f10 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
12f20 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
12f30 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
12f40 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
12f50 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
12f60 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
12f70 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
12f80 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
12f90 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
12fa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12fc0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
12fd0 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
12fe0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
12ff0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13000 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13010 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
13020 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
13030 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
13040 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13060 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
13070 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
13080 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
13090 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
130a0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
130b0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
130c0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
130d0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
130e0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
130f0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
13100 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
13110 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
13120 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
13130 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
13140 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
13150 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
13160 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
13170 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
13180 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
13190 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
131a0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
131b0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
131c0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
131d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
131e0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
131f0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
13200 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
13210 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
13220 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
13230 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
13240 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
13250 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
13260 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13270 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
13280 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13290 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
132a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
132b0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
132c0 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
132d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
132e0 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
132f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
13300 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
13310 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ize;.}..#if defi
13320 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43  ned(SQLITE_HAS_C
13330 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64  ODEC) || defined
13340 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
13350 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13360 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
13370 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13380 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
13390 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
133a0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
133b0 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
133c0 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
133d0 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
133e0 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
133f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
13400 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
13410 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
13420 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
13430 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
13440 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
13450 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
13460 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
13470 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
13480 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
13490 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
134a0 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
134b0 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
134c0 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
134d0 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
134e0 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
134f0 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
13500 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
13510 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
13520 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
13530 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
13540 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
13550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13560 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
13570 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
13580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13590 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
135a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
135b0 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
135c0 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
135d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d  t->usableSize;.}
135e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
135f0 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53  E_HAS_CODEC || S
13600 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
13610 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13620 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
13630 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
13640 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13650 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65  VACUUM)./*.** Re
13660 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
13670 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
13680 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
13690 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
136a0 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
136b0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
136c0 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
136d0 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
136e0 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
136f0 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
13700 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
13710 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
13720 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
13730 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
13740 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13750 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
13760 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
13770 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
13780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13790 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
137a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
137b0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
137c0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
137d0 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
137e0 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
137f0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
13800 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
13810 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
13820 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
13830 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
13840 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
13850 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
13860 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
13870 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
13880 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
13890 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
138a0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
138b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
138c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
138d0 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
138e0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
138f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
13900 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13910 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
13920 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43   Set the BTS_SEC
13930 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20  URE_DELETE flag 
13940 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20  if newFlag is 0 
13950 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61  or 1.  If newFla
13960 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e  g is -1,.** then
13970 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
13980 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
13990 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
139a0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
139b0 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61  ETE.** setting a
139c0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
139d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
139e0 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
139f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
13a00 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
13a10 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
13a20 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
13a30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13a40 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
13a50 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
13a60 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
13a70 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
13a80 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67  .    if( newFlag
13a90 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c   ) p->pBt->btsFl
13aa0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
13ab0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20  E_DELETE;.  } . 
13ac0 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
13ad0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
13ae0 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a  URE_DELETE)!=0;.
13af0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13b00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13b10 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   b;.}.#endif /* 
13b20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13b30 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
13b40 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
13b50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
13b60 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
13b70 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
13b80 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
13b90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
13ba0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
13bb0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
13bc0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
13bd0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
13be0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
13bf0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
13c00 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
13c10 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
13c20 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
13c30 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
13c40 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
13c50 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
13c60 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
13c70 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
13c80 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
13c90 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
13ca0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
13cb0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13cc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13ce0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
13cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13d00 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
13d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13d20 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
13d30 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
13d40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13d50 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
13d60 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
13d70 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
13d80 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
13d90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
13da0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13db0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
13dc0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
13dd0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
13de0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
13df0 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
13e00 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
13e10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13e20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
13e30 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
13e40 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
13e50 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
13e60 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
13e70 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
13e80 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
13e90 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
13ea0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
13eb0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
13ec0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
13ed0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
13ee0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13ef0 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
13f00 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
13f10 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
13f20 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
13f30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
13f40 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
13f50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
13f60 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
13f70 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
13f80 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
13f90 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
13fa0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
13fb0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
13fc0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
13fd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13fe0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
13ff0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
14000 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
14010 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
14020 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
14030 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
14040 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
14050 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
14060 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
14070 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
14080 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
14090 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
140a0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
140b0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
140c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
140d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
140e0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
140f0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
14100 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
14110 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
14120 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
14130 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
14140 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
14150 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
14160 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14170 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14180 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14190 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
141a0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
141b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
141c0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
141d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
141e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
141f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
14200 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
14210 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
14220 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
14230 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
14240 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14250 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14260 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
14270 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
14280 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
14290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
142a0 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
142b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
142c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
142d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
142e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
142f0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
14300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
14310 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
14320 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
14330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
14340 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
14350 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14360 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
14370 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14380 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14390 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
143a0 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
143b0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
143c0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
143d0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
143e0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
143f0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
14400 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
14410 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
14420 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
14430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
14440 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
14450 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
14460 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
14470 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
14480 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
14490 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
144a0 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
144b0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
144c0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
144d0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
144e0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
144f0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
14500 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
14510 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
14520 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
14530 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
14540 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
14550 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
14560 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
14570 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14580 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  iled;.    }..#if
14590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
145a0 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65  WAL.    if( page
145b0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
145c0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
145d0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
145e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
145f0 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
14600 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14610 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14620 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
14630 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20  page1[18]>2 ){. 
14640 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
14650 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
14660 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
14670 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
14680 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
14690 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
146a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
146b0 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
146c0 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
146d0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
146e0 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
146f0 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
14700 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
14710 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
14720 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
14730 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
14740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14750 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
14760 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
14770 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
14780 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
14790 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
147a0 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
147b0 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
147c0 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
147d0 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
147e0 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
147f0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
14800 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
14810 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
14820 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
14830 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
14840 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
14850 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
14860 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
14870 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
14880 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
14890 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d  s & BTS_NO_WAL)=
148a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
148b0 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
148c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
148d0 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
148e0 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
148f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14910 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
14920 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
14930 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f     }else if( isO
14940 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
14950 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
14960 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  age1);.        r
14970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
14990 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
149a0 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  B;.    }.#endif.
149b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
149c0 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
149d0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
149e0 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
149f0 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
14a00 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
14a10 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
14a20 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
14a30 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
14a40 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
14a50 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
14a60 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
14a70 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
14a80 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
14a90 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
14aa0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
14ab0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
14ac0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
14ad0 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
14ae0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
14af0 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
14b00 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14b10 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
14b20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
14b30 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
14b40 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
14b50 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
14b60 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
14b70 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
14b80 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
14b90 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
14ba0 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
14bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
14bc0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
14bd0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
14be0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
14bf0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
14c00 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
14c10 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
14c20 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
14c30 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
14c40 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
14c50 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
14c60 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
14c70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14c80 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
14c90 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
14ca0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
14cb0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
14cc0 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
14cd0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
14ce0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
14cf0 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
14d00 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
14d10 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
14d20 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
14d30 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
14d40 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
14d50 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
14d60 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
14d70 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
14d80 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
14d90 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
14da0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
14db0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
14dc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
14dd0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
14de0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14df0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
14e00 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
14e10 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
14e20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14e30 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14e40 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14e50 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
14e80 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
14e90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
14ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14eb0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
14ec0 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
14ed0 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
14ee0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
14ef0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14f00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
14f10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14f20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14f30 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
14f40 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
14f50 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14f60 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14f70 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
14f80 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
14f90 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
14fa0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
14fb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14fc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14fd0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
14fe0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14ff0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
15000 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
15010 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
15020 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
15030 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
15040 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
15050 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
15060 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
15070 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
15080 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
15090 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
150a0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
150b0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
150c0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
150d0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
150e0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
150f0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
15100 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
15110 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
15120 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
15130 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
15140 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
15150 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
15160 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
15170 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
15180 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
15190 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
151a0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
151b0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
151c0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
151d0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
151e0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
151f0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
15200 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
15210 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
15220 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
15230 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
15240 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
15250 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
15260 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
15270 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
15280 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
15290 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
152a0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
152b0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
152c0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
152d0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
152e0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
152f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
15300 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
15310 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
15320 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
15330 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
15340 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
15350 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
15360 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
15370 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
15380 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
15390 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
153a0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
153b0 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
153c0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
153d0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
153e0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
153f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
15400 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
15410 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
15420 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
15430 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
15440 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
15450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15460 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
15470 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
15480 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15490 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
154a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
154b0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
154c0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
154d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
154e0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
154f0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
15500 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
15510 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
15520 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
15530 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
15540 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
15550 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
15560 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
15570 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
15580 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
15590 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
155a0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
155b0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
155c0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
155d0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
155e0 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
155f0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
15600 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
15610 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
15620 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
15630 74 61 62 73 65 2e 20 20 43 75 72 73 6f 72 73 20  tabse.  Cursors 
15640 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
15650 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
15660 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
15670 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
15680 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
15690 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
156a0 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
156b0 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
156c0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
156d0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
156e0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
156f0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
15700 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
15710 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
15720 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
15730 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
15740 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
15750 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
15760 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
15770 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
15780 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
15790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
157a0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
157b0 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
157c0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
157d0 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
157e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
157f0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
15800 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
15810 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
15820 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
15830 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
15840 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
15850 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
15860 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
15870 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
15880 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
15890 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
158a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
158b0 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
158c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
158d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
158e0 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
158f0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
15900 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
15910 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15920 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
15940 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
15950 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
15960 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
15970 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
15980 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
15990 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
159a0 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
159b0 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
159c0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
159d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
159e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
159f0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
15a00 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
15a10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
15a20 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
15a30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15a40 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
15a50 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
15a60 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
15a70 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
15a80 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
15a90 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
15aa0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
15ab0 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
15ac0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
15ad0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
15ae0 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
15af0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
15b00 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
15b10 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
15b20 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
15b30 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
15b40 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
15b50 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
15b60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15b70 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15b80 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
15b90 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
15ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15bb0 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
15bc0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
15bd0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
15be0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
15bf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15c00 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
15c10 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
15c20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15c30 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
15c40 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
15c50 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
15c60 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
15c70 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
15c80 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
15c90 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
15ca0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
15cb0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
15cc0 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
15cd0 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
15ce0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
15cf0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
15d00 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
15d10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
15d20 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
15d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
15d40 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
15d50 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
15d60 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
15d70 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
15d80 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
15d90 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
15da0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
15db0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
15dc0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
15dd0 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
15de0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
15df0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
15e00 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
15e10 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15e20 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
15e30 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
15e40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15e50 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
15e60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
15e70 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
15e80 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
15e90 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
15ea0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
15eb0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
15ec0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
15ed0 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
15ee0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
15ef0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
15f00 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
15f10 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
15f20 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
15f30 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
15f40 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
15f50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15f60 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
15f70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
15f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15f90 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
15fa0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
15fb0 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
15fc0 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
15fd0 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
15fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
15ff0 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
16000 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
16010 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
16020 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
16030 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
16040 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
16050 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16060 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
16070 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
16080 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
16090 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
160a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
160b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
160c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
160d0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
160e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
160f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
16100 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
16110 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
16120 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
16130 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
16140 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
16150 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
16160 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
16170 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
16180 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
16190 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
161a0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
161b0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
161c0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
161d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
161e0 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
161f0 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
16200 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
16210 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
16220 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
16230 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
16240 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
16250 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
16260 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
16270 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
16280 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
16290 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
162a0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
162b0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
162c0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
162d0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
162e0 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
162f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
16300 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
16310 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
16320 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
16330 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
16340 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16350 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
16360 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16370 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
16380 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
16390 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
163a0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
163b0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
163c0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
163d0 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
163e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
163f0 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
16400 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
16410 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
16420 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
16430 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
16440 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
16450 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
16460 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
16470 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
16480 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
16490 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
164a0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
164b0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
164c0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
164d0 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
164e0 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
164f0 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
16500 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
16510 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
16520 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
16530 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
16540 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
16550 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
16560 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
16570 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
16580 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
16590 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
165a0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
165b0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
165c0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
165d0 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
165e0 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
165f0 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
16600 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
16610 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
16620 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
16630 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
16640 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
16650 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
16660 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
16670 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
16680 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
16690 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
166a0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
166b0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
166c0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
166d0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
166e0 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
166f0 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
16700 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
16710 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
16720 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
16730 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
16740 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
16750 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
16760 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
16770 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
16780 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
16790 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
167a0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
167b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
167c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
167d0 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
167e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
167f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
16800 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
16810 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
16820 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
16830 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
16840 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
16850 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
16860 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
16870 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
16880 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
16890 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
168a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
168b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
168c0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
168d0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
168e0 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
168f0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
16900 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16910 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16920 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
16930 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
16940 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
16950 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
16960 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
16970 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
16980 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
16990 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
169a0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
169b0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
169c0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
169d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
169e0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
169f0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
16a00 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
16a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16a20 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
16a30 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
16a40 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
16a50 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
16a60 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
16a70 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
16a80 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
16a90 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
16aa0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
16ab0 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
16ac0 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
16ad0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
16ae0 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
16af0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
16b00 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
16b10 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  E).   || (pBt->b
16b20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
16b30 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20  NDING)!=0.  ){. 
16b40 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
16b50 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
16b60 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
16b70 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
16b80 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
16b90 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
16ba0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
16bb0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
16bc0 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
16bd0 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
16be0 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
16bf0 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
16c00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16c20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
16c30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
16c40 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
16c50 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
16c60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
16c70 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
16c80 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
16c90 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
16ca0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
16cb0 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
16cc0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16cd0 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
16ce0 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
16cf0 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
16d00 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
16d10 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
16d20 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
16d30 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
16d40 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
16d50 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
16d60 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
16d70 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
16d80 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
16d90 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
16da0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
16db0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
16dc0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16dd0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
16de0 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
16df0 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
16e00 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
16e10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
16e20 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
16e30 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
16e40 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
16e50 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
16e60 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
16e70 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
16e80 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
16e90 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
16ea0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
16eb0 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
16ec0 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
16ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16ee0 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
16ef0 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
16f00 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
16f10 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
16f20 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
16f30 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
16f40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
16f50 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
16f60 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
16f70 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
16f80 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
16f90 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
16fa0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
16fb0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
16fc0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
16fd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
16fe0 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
16ff0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
17000 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
17010 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
17020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17030 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
17040 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
17050 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
17060 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
17070 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17080 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
17090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
170a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
170b0 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
170c0 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
170d0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
170e0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
170f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17110 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
17120 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
17130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
17140 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
17150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17160 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17170 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
17180 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
17190 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
171a0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
171b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
171c0 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
171d0 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
171e0 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
171f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
17200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
17210 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
17220 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
17230 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
17240 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
17250 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
17260 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
17270 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
17280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17290 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
172a0 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
172b0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
172c0 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
172d0 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
172e0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
172f0 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
17300 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
17310 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
17320 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
17330 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
17340 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
17350 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
17360 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
17370 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
17380 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
17390 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
173a0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
173b0 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
173c0 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
173d0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
173e0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
173f0 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
17400 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
17410 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
17420 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
17430 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
17440 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
17450 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17460 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
17470 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
17480 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
17490 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
174a0 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
174b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
174c0 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
174d0 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
174e0 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
174f0 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
17500 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
17510 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
17520 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
17530 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
17540 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
17550 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
17560 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
17570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
17580 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
17590 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
175a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
175b0 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
175c0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
175d0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
175e0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
175f0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
17600 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
17610 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17620 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
17630 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
17640 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
17650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17660 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
17670 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
17680 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
176a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
176b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
176c0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
176d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
176e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
176f0 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
17700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17710 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
17720 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
17730 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
17740 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
17750 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
17760 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
17770 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
17780 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
17790 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
177a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
177b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
177c0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
177d0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
177e0 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
177f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
17800 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
17810 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
17820 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
17830 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
17840 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
17850 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17860 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17870 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
17880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17890 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
178a0 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
178b0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
178c0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
178d0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
178e0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
178f0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
17900 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
17910 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
17920 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
17930 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
17940 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
17950 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
17960 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
17970 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
17980 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
17990 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179b0 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
179c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
179d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
179e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
179f0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
17a00 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
17a10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
17a40 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
17a50 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
17a60 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
17a70 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
17a80 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
17a90 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
17aa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ab0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
17ac0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
17ad0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
17ae0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
17af0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
17b10 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
17b20 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
17b30 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
17b40 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
17b50 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
17b60 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
17b70 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
17b80 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
17b90 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
17ba0 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
17bb0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
17bc0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
17bd0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
17be0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
17bf0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17c00 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
17c10 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
17c20 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
17c30 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
17c40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
17c50 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
17c60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
17c70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
17c80 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
17c90 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
17ca0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
17cb0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
17cc0 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
17cd0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
17ce0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
17cf0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
17d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17d10 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
17d20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
17d30 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
17d40 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
17d50 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
17d60 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
17d70 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
17d80 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
17d90 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
17da0 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
17db0 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
17dc0 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
17dd0 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
17de0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
17df0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17e00 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
17e10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17e20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
17e30 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
17e40 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
17e50 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
17e60 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
17e70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
17e80 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
17e90 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
17ea0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
17eb0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
17ec0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
17ed0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
17ee0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
17ef0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
17f00 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
17f10 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
17f30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
17f40 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
17f50 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
17f60 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
17f70 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
17f80 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
17f90 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
17fa0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17fb0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
17fc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
17fe0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
17ff0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
18000 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
18010 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
18020 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
18030 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
18040 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
18050 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
18060 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
18070 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
18080 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
18090 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
180a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
180b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
180c0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
180d0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
180e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
180f0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
18100 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
18110 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
18120 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74  t nCell;..    bt
18130 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
18140 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  e);.    nCell = 
18150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
18160 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
18170 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
18180 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
18190 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
181a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
181b0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
181c0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
181d0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
181e0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
181f0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
18200 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
18210 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
18220 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
18230 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
18240 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
18250 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
18260 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
18270 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
18280 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
18290 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
182a0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
182b0 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
182c0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
182d0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
182e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
182f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
18300 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
18310 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
18320 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
18330 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
18340 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
18350 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
18360 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18370 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
18380 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
18390 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
183a0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
183b0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
183c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
183d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
183e0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
183f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18400 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
18410 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
18420 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
18430 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
18440 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
18450 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
18460 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
18470 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
18480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
18490 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
184a0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
184b0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
184c0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
184d0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
184e0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
184f0 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
18500 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
18510 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
18520 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
18530 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
18540 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
18550 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
18560 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
18570 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
18580 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
18590 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
185a0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
185b0 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
185c0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
185d0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
185e0 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
185f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
18600 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
18610 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
18620 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
18630 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
18640 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
18650 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
18660 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
18690 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
186a0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
186b0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
186c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
186d0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
186e0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
186f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
18700 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
18710 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
18720 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
18730 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
18740 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
18750 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
18760 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
18770 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
18780 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
18790 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
187a0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
187b0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
187c0 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
187d0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
187e0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
187f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18800 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
18810 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18820 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
18830 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
18840 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
18850 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
18860 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
18870 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
18880 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
18890 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
188a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
188b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
188c0 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
188d0 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
188e0 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
188f0 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
18900 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
18910 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
18920 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
18930 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
18940 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
18950 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
18960 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
18970 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
18980 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
18990 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
189a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
189b0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
189c0 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
189d0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
189e0 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
189f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18a00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
18a10 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
18a20 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
18a30 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
18a40 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
18a50 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
18a60 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
18a70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
18a80 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
18a90 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
18aa0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
18ab0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
18ac0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
18ad0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
18ae0 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
18af0 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
18b00 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
18b10 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
18b20 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
18b30 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
18b40 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
18b50 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
18b60 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
18b70 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
18b80 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
18b90 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
18ba0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
18bb0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
18bc0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
18bd0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
18be0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
18bf0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18c00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
18c10 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
18c20 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18c50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18c60 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
18c70 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
18c80 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
18c90 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
18ca0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
18cb0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
18cc0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
18cd0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
18ce0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
18cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18d00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18d10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
18d20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
18d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
18d40 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
18d50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
18d60 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
18d70 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
18d80 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
18d90 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
18da0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
18db0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
18dc0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
18dd0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
18de0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
18df0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
18e00 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
18e10 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
18e20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18e60 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
18e70 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
18e80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
18ea0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
18eb0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
18ec0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
18ed0 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
18ee0 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
18ef0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
18f00 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
18f10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
18f20 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18f40 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
18f50 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
18f60 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
18f70 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
18f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18f90 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
18fa0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
18fb0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
18fc0 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
18fd0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
18fe0 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
18ff0 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
19000 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
19010 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
19020 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
19030 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
19040 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
19050 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
19060 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
19070 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
19080 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
19090 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
190a0 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
190b0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
190c0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
190d0 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
190e0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
190f0 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
19100 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
19110 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
19120 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
19130 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
19140 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
19150 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
19160 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
19170 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
19180 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
19190 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
191a0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
191b0 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
191c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
191d0 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
191e0 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
191f0 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
19200 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
19210 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
19220 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
19230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
19240 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
19250 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
19260 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
19270 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
19280 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
19290 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
192a0 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
192b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
192c0 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
192d0 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
192e0 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
192f0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
19300 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f  on-commmit .** o
19310 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
19320 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
19330 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
19340 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
19350 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
19360 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
19370 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
19380 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
19390 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
193a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
193b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
193c0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
193d0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
193e0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
193f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19400 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19410 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
19420 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
19430 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
19440 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
19450 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
19460 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19470 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
19480 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
19490 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
194a0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
194b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
194c0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
194d0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
194e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
194f0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19500 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
19510 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
19520 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
19530 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
19540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19550 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19570 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
19580 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
19590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
195a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
195b0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
195c0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
195d0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
195e0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
195f0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
19600 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
19610 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
19620 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
19630 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
19640 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
19650 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
19660 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
19670 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
19680 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
19690 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
196a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
196b0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
196c0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
196d0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
196e0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
196f0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
19700 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
19710 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
19720 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
19730 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
19740 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
19750 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
19760 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
19770 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
19780 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
19790 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
197a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
197c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
197d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
197e0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
197f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
19800 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
19810 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
19820 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
19830 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
19840 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
19850 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
19860 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
19870 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
19880 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
19890 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
198a0 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
198b0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
198c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
198d0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
198e0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
198f0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
19900 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
19910 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
19920 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
19930 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
19940 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
19950 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
19960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19970 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19980 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
19990 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
199a0 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
199b0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
199c0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
199d0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
199e0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
199f0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
19a00 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
19a10 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
19a20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19a30 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
19a40 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
19a50 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
19a60 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
19a70 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
19a80 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
19a90 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
19aa0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
19ab0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
19ac0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
19ad0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
19ae0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
19af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
19b00 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
19b10 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
19b20 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
19b30 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
19b40 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
19b50 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
19b60 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
19b70 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
19b80 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
19b90 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
19ba0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19bc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19bd0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
19be0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19c00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
19c10 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
19c20 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
19c30 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
19c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
19c50 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
19c60 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
19c70 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
19c80 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
19c90 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
19ca0 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
19cb0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
19cc0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
19cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19d00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19d10 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
19d20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
19d30 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
19d40 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
19d50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19d60 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
19d70 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
19d80 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
19d90 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
19da0 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
19db0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
19dc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19dd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19de0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
19df0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
19e00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
19e10 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
19e20 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
19e30 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
19e40 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
19e50 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
19e60 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
19e70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19e80 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
19e90 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
19ea0 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
19eb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
19ec0 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
19ed0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
19ee0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
19ef0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
19f00 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
19f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19f20 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
19f30 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
19f40 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
19f50 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
19f60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19f70 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
19f80 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
19f90 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
19fc0 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
19fd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
19fe0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
19ff0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1a000 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1a010 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1a020 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1a030 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1a040 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1a050 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1a060 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1a070 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1a080 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1a090 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1a0a0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1a0b0 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1a0c0 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1a0d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1a0e0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1a0f0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1a100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1a110 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1a120 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1a130 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1a140 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1a150 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1a160 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1a170 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1a180 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1a190 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1a1a0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1a1b0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1a1c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1a1d0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1a1e0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1a1f0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1a200 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1a210 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1a220 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1a230 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1a240 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1a250 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1a260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a270 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1a280 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1a290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a2a0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1a2b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1a2d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a2e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1a2f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a300 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1a310 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1a320 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1a330 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1a340 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1a350 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1a360 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1a370 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1a380 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a390 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1a3a0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1a3b0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1a3c0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1a3d0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1a3e0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1a3f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a400 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1a410 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1a420 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1a430 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1a440 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1a450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a460 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1a470 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1a480 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1a490 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1a4a0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1a4b0 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1a4c0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1a4d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a4e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a4f0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1a500 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1a510 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1a520 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a530 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1a540 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1a550 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1a560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1a570 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1a580 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a590 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a5a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1a5b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a5c0 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1a5d0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1a5e0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1a5f0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1a600 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1a610 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1a620 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1a630 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1a640 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1a650 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1a660 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1a670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a680 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1a690 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1a6a0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1a6b0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1a6c0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1a6d0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1a6e0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1a6f0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1a700 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1a710 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a720 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1a730 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1a740 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a750 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1a760 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1a770 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1a780 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1a790 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1a7a0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
1a7b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a7c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1a7d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1a7e0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1a7f0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1a800 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1a810 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1a820 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1a830 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1a840 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1a850 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1a860 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1a870 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1a880 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1a890 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1a8a0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1a8b0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1a8c0 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1a8d0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1a8e0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1a8f0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1a900 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1a910 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1a920 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1a930 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1a940 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1a950 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1a960 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1a970 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1a980 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1a990 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1a9a0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1a9b0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1a9c0 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1a9d0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1a9e0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1a9f0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1aa00 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1aa10 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1aa20 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1aa30 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1aa40 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1aa50 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1aa60 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1aa70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aa80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1aa90 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1aaa0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1aab0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1aac0 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1aad0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1aae0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1aaf0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1ab00 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
1ab10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ab20 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
1ab30 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
1ab40 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1ab50 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1ab60 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
1ab70 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
1ab80 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
1ab90 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
1aba0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1abb0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1abc0 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1abd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1abe0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1abf0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1ac00 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1ac10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ac20 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1ac30 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1ac40 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1ac50 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1ac60 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
1ac70 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ac80 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ac90 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
1aca0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1acb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1acc0 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
1acd0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ace0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
1acf0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
1ad00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1ad10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ad20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ad30 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1ad40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1ad50 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
1ad60 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1ad70 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
1ad80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1ad90 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
1ada0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1adb0 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
1adc0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1add0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
1ade0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1adf0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1ae00 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
1ae10 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
1ae20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
1ae30 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
1ae40 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
1ae50 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
1ae60 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1ae70 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
1ae80 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
1ae90 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
1aea0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
1aeb0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
1aec0 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
1aed0 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
1aee0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
1aef0 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
1af00 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
1af10 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
1af20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1af30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
1af40 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
1af50 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
1af60 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
1af70 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
1af80 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
1af90 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
1afa0 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
1afb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1afc0 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
1afd0 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
1afe0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
1aff0 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
1b000 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
1b010 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
1b020 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
1b030 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
1b040 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
1b050 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1b060 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
1b070 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
1b080 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b090 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
1b0a0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
1b0b0 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
1b0c0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
1b0d0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1b0e0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
1b0f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
1b100 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
1b110 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
1b120 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
1b130 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1b140 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
1b150 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
1b160 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
1b170 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b180 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
1b190 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
1b1a0 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
1b1b0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
1b1c0 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
1b1d0 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
1b1e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b1f0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
1b200 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1b210 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
1b220 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
1b230 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1b240 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
1b250 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
1b260 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
1b270 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
1b280 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
1b290 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1b2a0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
1b2b0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
1b2c0 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
1b2d0 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
1b2e0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
1b2f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b300 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
1b310 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
1b320 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1b330 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
1b340 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b350 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
1b360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1b370 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
1b380 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1b390 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1b3a0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1b3b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b3c0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
1b3d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b3e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1b3f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b400 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
1b410 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1b420 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
1b430 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
1b440 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b470 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
1b480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b490 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b4a0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1b4b0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1b4c0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1b4d0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
1b4e0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1b4f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b510 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1b520 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
1b530 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
1b540 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b550 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1b560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1b570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1b580 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
1b590 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b5a0 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
1b5b0 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
1b5c0 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
1b5d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
1b5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b5f0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1b600 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
1b610 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b620 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1b630 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1b640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b650 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1b660 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1b670 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b680 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1b690 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1b6a0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
1b6b0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1b6c0 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
1b6d0 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
1b6e0 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
1b6f0 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
1b700 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
1b710 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1b720 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
1b730 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
1b740 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1b750 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
1b760 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
1b770 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
1b780 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1b790 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
1b7a0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
1b7b0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1b7c0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
1b7d0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
1b7e0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1b7f0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1b800 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
1b810 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
1b820 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
1b830 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
1b840 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
1b850 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1b860 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
1b870 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
1b880 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
1b890 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1b8a0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1b8b0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
1b8c0 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
1b8d0 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
1b8e0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
1b8f0 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
1b900 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
1b910 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1b920 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
1b930 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1b940 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
1b950 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
1b960 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
1b970 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1b980 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
1b990 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1b9a0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
1b9b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1b9c0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
1b9d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
1b9e0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
1b9f0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
1ba00 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
1ba10 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
1ba20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
1ba30 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1ba40 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
1ba50 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
1ba60 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
1ba70 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1ba80 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1ba90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1baa0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1bab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1bac0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1bad0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1bae0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1baf0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1bb00 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1bb10 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1bb20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1bb30 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1bb40 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1bb50 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1bb60 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1bb70 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1bb80 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1bb90 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1bba0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1bbb0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1bbc0 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1bbd0 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1bbe0 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1bbf0 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1bc00 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1bc10 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1bc20 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1bc30 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1bc40 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1bc50 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1bc60 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1bc70 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1bc80 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1bc90 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1bca0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1bcb0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1bcc0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1bcd0 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1bce0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1bcf0 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1bd00 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1bd10 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1bd20 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1bd30 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1bd40 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1bd50 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1bd60 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1bd70 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1bd80 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1bd90 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1bda0 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1bdb0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1bdc0 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1bdd0 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1bde0 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1bdf0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1be00 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1be10 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1be20 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1be30 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1be40 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1be50 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1be60 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1be70 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1be80 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1be90 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1bea0 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1beb0 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1bec0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1bed0 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1bee0 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1bef0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1bf00 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1bf10 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1bf20 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1bf30 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1bf40 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1bf50 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1bf60 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1bf70 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1bf80 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1bf90 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1bfa0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1bfb0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1bfc0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bfd0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1bfe0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1bff0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1c000 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1c010 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1c020 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c030 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1c040 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1c050 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1c060 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c070 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1c080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1c090 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c0a0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1c0b0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1c0c0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1c0d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1c0e0 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1c0f0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1c100 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1c110 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1c120 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1c130 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1c140 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1c150 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1c160 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1c170 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c180 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1c190 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1c1a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1c1b0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1c1c0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1c1d0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1c1e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c1f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1c200 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1c210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c220 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1c230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1c240 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c260 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
1c270 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1c280 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1c290 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1c2a0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1c2b0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1c2c0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1c2d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c2e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1c2f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c300 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1c310 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1c320 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c330 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1c340 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1c350 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1c360 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1c370 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c380 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
1c390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c3a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c3b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1c3c0 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
1c3d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1c3e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1c3f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c400 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1c410 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
1c420 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
1c430 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
1c440 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
1c450 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
1c460 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
1c470 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1c480 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
1c490 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
1c4a0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
1c4b0 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
1c4c0 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
1c4d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c4e0 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
1c4f0 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
1c500 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
1c510 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
1c520 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
1c530 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
1c540 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
1c550 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
1c560 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
1c570 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
1c580 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
1c590 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
1c5a0 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
1c5b0 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
1c5c0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
1c5d0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1c5e0 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
1c5f0 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
1c600 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
1c610 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
1c620 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
1c630 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
1c640 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
1c650 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
1c660 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
1c670 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1c680 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
1c690 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
1c6a0 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
1c6b0 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
1c6c0 72 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ree==0 ) return;
1c6d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1c6e0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1c6f0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1c700 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1c710 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1c720 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1c730 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1c740 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1c750 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1c760 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1c770 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1c780 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1c790 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1c7a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1c7b0 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1c7c0 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1c7d0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1c7e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1c7f0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1c800 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1c810 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1c820 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1c830 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1c840 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1c850 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1c860 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1c870 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1c880 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1c890 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1c8a0 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1c8b0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1c8c0 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1c8d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1c8e0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1c8f0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1c900 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1c910 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1c920 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1c930 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1c940 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1c950 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c960 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1c970 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
1c980 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Code){.  int rc;
1c990 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c9a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1c9b0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1c9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c9d0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
1c9e0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
1c9f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
1ca00 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
1ca10 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1ca20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ca30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ca40 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
1ca50 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1ca60 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1ca70 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
1ca80 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  );.  }.  btreeIn
1ca90 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1caa0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1cab0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1cac0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1cad0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1cae0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1caf0 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1cb00 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1cb10 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1cb20 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1cb30 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1cb40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1cb50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1cb60 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1cb70 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1cb80 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1cb90 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1cba0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1cbb0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1cbc0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1cbd0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1cbe0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1cbf0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1cc00 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1cc10 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1cc20 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1cc30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1cc40 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1cc50 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1cc60 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1cc70 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1cc80 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1cc90 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1cca0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1ccb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1ccc0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1ccd0 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1cce0 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1ccf0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1cd00 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1cd10 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1cd20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1cd30 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1cd40 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1cd50 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1cd60 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1cd70 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1cd80 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1cd90 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1cda0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1cdb0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1cdc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1cdd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cde0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1cdf0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1ce00 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1ce10 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
1ce20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1ce30 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1ce40 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1ce50 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1ce60 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1ce70 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1ce80 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1ce90 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1cea0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1ceb0 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1cec0 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1ced0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1cee0 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1cef0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1cf00 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1cf10 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1cf20 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1cf30 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1cf40 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1cf50 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1cf60 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1cf70 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1cf80 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1cf90 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1cfa0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1cfb0 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1cfc0 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1cfd0 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1cfe0 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1cff0 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1d000 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1d010 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1d020 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1d030 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1d040 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1d050 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1d060 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1d070 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1d080 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1d090 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1d0a0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1d0b0 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1d0c0 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1d0d0 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1d0e0 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1d0f0 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1d100 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1d110 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1d120 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1d130 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1d140 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1d150 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1d160 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1d170 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1d180 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1d190 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1d1a0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1d1b0 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1d1c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d1d0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1d1e0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1d1f0 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1d200 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1d210 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1d220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d230 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1d240 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d250 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1d260 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
1d270 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1d280 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
1d290 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1d2a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1d2b0 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1d2c0 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1d2d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1d2e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1d2f0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1d300 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1d310 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1d320 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d330 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1d340 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1d350 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1d360 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1d370 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1d380 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1d390 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1d3a0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1d3b0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1d3c0 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1d3d0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1d3e0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1d3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1d400 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1d410 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1d420 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1d430 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1d440 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1d450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1d460 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1d470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d480 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1d490 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1d4a0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1d4b0 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1d4c0 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1d4d0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1d4e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1d4f0 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1d500 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1d510 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1d520 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1d530 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1d540 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1d550 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1d560 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1d570 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1d580 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1d590 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1d5a0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1d5b0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1d5c0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1d5d0 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1d5e0 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1d5f0 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1d600 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1d610 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1d620 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1d630 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1d640 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1d650 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1d660 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1d670 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1d680 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1d690 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1d6a0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1d6b0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1d6c0 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1d6d0 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1d6e0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1d6f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d700 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1d710 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d720 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1d730 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1d740 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1d750 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1d760 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1d770 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1d780 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1d790 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1d7a0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1d7b0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1d7c0 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1d7d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d7e0 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1d7f0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1d800 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1d810 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1d820 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d840 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1d850 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1d860 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
1d870 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
1d880 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
1d890 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1d8a0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1d8b0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1d8c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1d8d0 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1d8e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d8f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1d900 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1d910 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1d920 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1d930 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1d940 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1d950 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1d960 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1d970 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1d980 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1d990 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1d9a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1d9b0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1d9c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d9d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1d9e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d9f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1da00 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1da10 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1da20 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1da30 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1da40 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1da50 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1da60 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1da70 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1da80 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1da90 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1daa0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1dab0 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1dac0 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1dad0 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1dae0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1daf0 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1db00 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1db10 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1db20 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1db30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1db40 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1db50 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1db60 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1db70 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1db80 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1db90 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1dba0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1dbb0 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1dbc0 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1dbd0 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1dbe0 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1dbf0 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1dc00 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1dc10 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1dc20 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1dc30 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1dc40 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1dc50 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1dc60 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1dc70 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1dc80 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1dc90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1dca0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1dcb0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1dcc0 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1dcd0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1dce0 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1dcf0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1dd00 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1dd10 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1dd20 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1dd30 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1dd40 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1dd50 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1dd60 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1dd70 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1dd80 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1dd90 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1dda0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1ddb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ddc0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1ddd0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1dde0 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1ddf0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1de00 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1de10 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1de20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1de30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1de40 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1de50 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1de60 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1de70 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1de80 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1de90 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1dea0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1deb0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1dec0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1ded0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1dee0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1def0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1df00 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1df10 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1df20 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1df30 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1df40 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1df50 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1df60 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1df70 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1df80 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dfb0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1dfc0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1dff0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1e000 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1e010 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e030 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1e040 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1e050 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1e060 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1e070 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e080 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1e090 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1e0a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1e0d0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1e0e0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1e0f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e110 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1e120 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1e130 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1e140 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1e150 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1e160 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1e170 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1e180 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1e190 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1e1a0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1e1b0 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1e1c0 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1e1d0 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1e1e0 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1e1f0 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1e200 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1e210 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1e220 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1e230 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1e240 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1e250 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1e260 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1e270 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1e280 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1e290 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1e2a0 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1e2b0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1e2c0 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1e2d0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1e2e0 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1e2f0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1e300 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1e310 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1e320 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1e330 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1e340 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1e350 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1e360 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1e370 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1e380 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1e390 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1e3a0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1e3b0 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1e3c0 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  g && (pBt->btsFl
1e3d0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1e3e0 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  NLY)!=0) ){.    
1e3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1e400 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1e410 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
1e420 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1e430 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
1e440 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
1e450 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
1e460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1e470 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1e480 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1e490 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1e4a0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1e4b0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1e4c0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1e4d0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1e4e0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1e4f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1e500 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1e510 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1e520 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1e530 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1e540 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1e550 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1e560 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
1e570 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
1e580 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
1e590 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
1e5a0 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
1e5b0 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
1e5c0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
1e5d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
1e5e0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
1e5f0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1e600 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
1e610 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
1e620 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1e630 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1e640 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e650 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1e660 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1e670 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6a0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1e6b0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1e6e0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1e6f0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1e700 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1e730 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1e740 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1e750 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1e760 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1e770 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e780 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1e790 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1e7a0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1e7d0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1e7e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1e7f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e800 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1e810 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1e820 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1e830 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1e840 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e860 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e870 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1e880 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1e890 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1e8a0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1e8b0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1e8c0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1e8d0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1e8e0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1e8f0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1e900 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1e910 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1e920 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1e930 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1e940 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1e950 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1e960 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1e970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e990 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1e9a0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1e9b0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1e9c0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1e9d0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1e9e0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1e9f0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1ea00 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1ea10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1ea20 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1ea30 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1ea40 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1ea50 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1ea60 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1ea70 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1ea80 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1ea90 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1eaa0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1eab0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1eac0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1ead0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1eae0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1eaf0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1eb00 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1eb10 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1eb20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1eb30 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1eb40 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1eb50 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1eb60 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1eb70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1eb80 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1eb90 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1eba0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ebb0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1ebc0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1ebd0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1ebe0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ebf0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1ec00 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1ec10 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1ec20 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1ec30 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1ec40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1ec50 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ec60 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1ec70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ec80 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1ec90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1eca0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1ecb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1ecc0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1ecd0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1ece0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1ecf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ed00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1ed10 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1ed20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1ed30 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1ed40 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1ed50 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1ed60 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ed70 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1ed80 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1ed90 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1eda0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1edb0 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1edc0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1edd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1ede0 72 65 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20  ree(pBtree->db, 
1edf0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
1ee00 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1ee10 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1ee20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ee30 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1ee40 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ee50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ee60 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1ee70 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1ee80 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1ee90 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1eea0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1eeb0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1eec0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1eed0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1eee0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1eef0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1ef00 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1ef10 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1ef20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1ef30 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1ef40 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1ef50 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1ef60 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1ef70 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1ef80 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1ef90 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1efa0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1efb0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1efc0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1efd0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1efe0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1eff0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1f000 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1f010 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1f020 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1f030 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1f040 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1f050 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1f060 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1f070 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1f080 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1f090 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1f0a0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1f0b0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1f0c0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1f0d0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1f0e0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1f0f0 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1f100 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1f110 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1f120 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1f130 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1f140 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1f150 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1f160 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1f170 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1f180 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1f190 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1f1a0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1f1b0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1f1c0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1f1d0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1f1e0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1f1f0 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1f200 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
1f210 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
1f220 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1f230 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1f240 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1f250 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1f260 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1f270 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1f280 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1f290 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1f2a0 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1f2b0 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1f2c0 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1f2d0 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1f2e0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1f2f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1f300 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1f310 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1f320 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1f330 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74  >iPage;.      bt
1f340 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1f350 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1f360 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1f370 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1f380 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
1f390 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
1f3a0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65  alidNKey;.    }e
1f3b0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1f3c0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1f3d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
1f3e0 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
1f3f0 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
1f400 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
1f410 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
1f420 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
1f430 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
1f440 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
1f450 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
1f4a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4e0 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
1f4f0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61     \.    btreePa
1f540 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1f550 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1f560 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1f570 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20  pCur->info);    
1f580 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e      \.    pCur->
1f590 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
1f5a0 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20  _ValidNKey;     
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
1f630 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1f640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
1f680 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
1f690 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  */..#ifndef NDEB
1f6a0 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
1f6b0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
1f6c0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1f6d0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1f6e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1f6f0 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
1f700 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
1f710 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
1f720 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
1f730 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1f740 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
1f750 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
1f760 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
1f770 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
1f780 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
1f790 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1f7a0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1f7b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1f7c0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1f7d0 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
1f7e0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
1f7f0 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
1f800 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f810 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
1f820 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  EBUG */../*.** S
1f830 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1f840 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
1f850 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
1f860 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
1f870 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
1f880 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
1f890 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1f8a0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1f8b0 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
1f8c0 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
1f8d0 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
1f8e0 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
1f8f0 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
1f900 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
1f910 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1f920 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
1f930 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
1f940 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
1f950 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
1f960 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f  ler must positio
1f970 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69  n the cursor pri
1f980 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1f990 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
1f9a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f9b0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49   cannot fail.  I
1f9c0 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
1f9d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f   SQLITE_OK.  .*/
1f9e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f9f0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
1fa00 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
1fa10 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1fa20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1fa30 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1fa40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1fa50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1fa60 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1fa70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1fa80 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1fa90 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
1faa0 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65  ID ){.    *pSize
1fab0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1fac0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1fad0 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  Cur);.    *pSize
1fae0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1faf0 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ey;.  }.  return
1fb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fb10 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1fb20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1fb30 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
1fb40 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
1fb50 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
1fb60 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
1fb70 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1fb80 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
1fb90 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
1fba0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
1fbb0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
1fbc0 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
1fbd0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
1fbe0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
1fbf0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
1fc00 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
1fc10 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
1fc20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fc30 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65  D..**.** Failure
1fc40 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1fc50 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
1fc60 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1fc70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74  SQLITE_OK..** It
1fc80 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77   might just as w
1fc90 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75  ell be a procedu
1fca0 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f  re (returning vo
1fcb0 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69  id) but we conti
1fcc0 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e  nue.** to return
1fcd0 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75   an integer resu
1fce0 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74  lt code for hist
1fcf0 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a  orical reasons..
1fd00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fd10 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
1fd20 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1fd30 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1fd40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fd50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1fd60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1fd70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fd80 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
1fd90 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
1fda0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1fdb0 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  nData;.  return 
1fdc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1fdd0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
1fde0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
1fdf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1fe00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
1fe10 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
1fe20 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1fe30 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
1fe40 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1fe50 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
1fe60 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
1fe70 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
1fe80 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
1fe90 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
1fea0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
1feb0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
1fec0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
1fed0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
1fee0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
1fef0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
1ff00 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
1ff10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1ff20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1ff30 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
1ff40 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1ff50 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
1ff60 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1ff70 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
1ff80 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
1ff90 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
1ffa0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
1ffb0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
1ffc0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
1ffd0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
1ffe0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
1fff0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
20000 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
20010 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
20020 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
20030 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
20040 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
20050 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
20060 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
20070 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20080 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
20090 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
200a0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
200b0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
200c0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
200d0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
200e0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
200f0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
20100 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
20110 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
20120 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
20130 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
20140 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
20150 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
20160 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
20170 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
20180 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
20190 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
201a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
201b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
201c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
201d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
20200 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
20210 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
20220 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
20230 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
20240 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
20250 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
20260 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
20270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20280 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
20290 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
202a0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
202b0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
202c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
202d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
202e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
202f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20300 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20310 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
20320 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
20330 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20340 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
20350 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
20360 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
20370 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
20380 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
20390 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
203a0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
203b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
203c0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
203d0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
203e0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
203f0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
20400 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
20410 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
20420 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
20430 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
20440 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
20450 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
20460 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
20470 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
20480 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20490 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
204a0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
204b0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
204c0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
204d0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
204e0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
204f0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
20500 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
20510 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
20520 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
20530 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
20540 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20550 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
20560 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
20570 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
20580 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
20590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
205a0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
205b0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
205c0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
205d0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
205e0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
205f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
20600 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
20610 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
20620 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
20630 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
20640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20650 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
20660 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
20670 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
20680 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
20690 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
206a0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
206b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
206c0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
206d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
206e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
206f0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
20700 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
20710 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
20720 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
20730 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
20740 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
20750 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20760 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
20770 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20780 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
20790 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
207a0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
207b0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
207c0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
207d0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
207e0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
207f0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
20800 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
20810 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
20820 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
20830 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
20840 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
20850 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
20860 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
20870 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
20880 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
20890 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
208a0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
208b0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
208c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
208d0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
208e0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
208f0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
20900 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
20910 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
20920 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
20930 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
20940 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
20950 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
20960 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
20970 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
20980 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
20990 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
209a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
209b0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
209c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209e0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
209f0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
20a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20a10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
20a20 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
20a30 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
20a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
20a50 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
20a60 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
20a70 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
20a80 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
20a90 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
20aa0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
20ab0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
20ac0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
20ad0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
20ae0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
20af0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
20b00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
20b10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
20b20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20b30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20b40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
20b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
20b60 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
20b70 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
20b80 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
20b90 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
20ba0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
20bb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
20bc0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
20bd0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
20be0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20c00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20c10 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
20c20 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
20c30 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
20c40 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
20c50 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
20c60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
20c70 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
20c80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
20c90 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
20ca0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
20cb0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
20cc0 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
20cd0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
20ce0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
20cf0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
20d00 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
20d10 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
20d20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
20d30 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
20d40 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
20d50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
20d60 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
20d70 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
20d80 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
20d90 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
20da0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
20db0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
20dc0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
20dd0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
20de0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
20df0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
20e00 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
20e10 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
20e20 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
20e30 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
20e40 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
20e50 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
20e60 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
20e70 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
20e80 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
20e90 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
20ea0 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
20eb0 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
20ec0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
20ed0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
20ee0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
20ef0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
20f00 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20f10 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
20f20 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
20f30 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
20f40 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
20f50 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
20f60 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
20f70 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
20f80 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
20f90 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
20fa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
20fb0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
20fc0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
20fd0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
20fe0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
20ff0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
21000 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
21010 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
21020 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
21030 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
21040 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
21050 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
21060 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
21070 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
21080 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
21090 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
210a0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
210b0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
210c0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
210d0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
210e0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
210f0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
21100 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
21110 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
21120 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
21130 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
21140 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
21150 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
21160 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
21170 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
21180 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
21190 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
211a0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
211b0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
211c0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
211d0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
211e0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
211f0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
21200 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
21210 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
21220 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
21230 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
21240 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
21250 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
21260 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
21270 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
21280 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
21290 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
212a0 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
212b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
212c0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
212d0 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
212e0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
212f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21300 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
21310 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
21320 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
21330 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
21340 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
21350 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
21360 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
21370 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
21380 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21390 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
213a0 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20  int bEnd;       
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
213d0 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74  rue if reading t
213e0 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f  o end of data */
213f0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
21400 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
21410 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21420 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21440 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21450 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
21460 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
21470 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21480 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21490 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f  ert( eOp!=2 || o
214a0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
214b0 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
214c0 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
214d0 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
214e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
214f0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
21500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
21510 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
21520 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
21530 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
21540 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
21550 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 23 69 66  >info.nKey);.#if
21560 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
21570 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
21580 20 20 62 45 6e 64 20 3d 20 28 6f 66 66 73 65 74    bEnd = (offset
21590 2b 61 6d 74 3d 3d 6e 4b 65 79 2b 70 43 75 72 2d  +amt==nKey+pCur-
215a0 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 3b 0a 23 65  >info.nData);.#e
215b0 6e 64 69 66 0a 0a 20 20 69 66 28 20 4e 45 56 45  ndif..  if( NEVE
215c0 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
215d0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
215e0 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
215f0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
21600 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
21610 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
21620 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
21630 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
21640 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
21650 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
21660 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
21670 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
21680 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21690 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
216a0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
216b0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
216c0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
216d0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
216e0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
216f0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
21700 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
21710 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
21720 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
21730 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
21740 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
21750 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
21760 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
21770 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
21780 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
21790 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
217a0 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
217b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
217c0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
217d0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
217e0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
217f0 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
21800 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21810 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
21820 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
21830 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
21840 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
21850 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21860 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
21870 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
21880 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
21890 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
218a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
218b0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
218c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
218d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
218e0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
218f0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
21900 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
21910 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
21920 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
21930 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
21940 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
21950 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
21960 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
21970 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
21980 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
21990 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
219a0 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
219b0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
219c0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
219d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
219e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
219f0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
21a00 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
21a10 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
21a20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
21a30 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
21a40 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
21a50 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
21a60 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
21a70 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
21a80 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
21a90 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
21aa0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
21ab0 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
21ac0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
21ad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
21ae0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
21af0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
21b00 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
21b10 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
21b20 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
21b30 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
21b40 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
21b50 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20  te3DbRealloc(.  
21b60 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
21b70 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72  pBtree->db, pCur
21b80 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
21b90 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
21ba0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
21bb0 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
21bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
21bd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21be0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21bf0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
21c00 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
21c10 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
21c20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
21c30 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
21c40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
21c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
21c70 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
21c80 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
21c90 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
21ca0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
21cb0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
21cc0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
21cd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
21ce0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
21cf0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
21d00 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
21d10 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
21d20 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
21d30 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
21d40 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
21d50 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
21d60 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
21d70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
21d80 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
21d90 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
21da0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  !=0 && pCur->aOv
21db0 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
21dc0 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
21dd0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
21de0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
21df0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
21e00 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21e10 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
21e20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
21e30 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
21e40 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
21e50 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
21e60 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
21e70 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
21e80 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
21e90 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
21ea0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
21eb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
21ec0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
21ed0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
21ee0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
21ef0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
21f00 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
21f10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21f20 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
21f30 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
21f40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
21f50 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
21f60 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f    }..      if( o
21f70 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
21f80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
21f90 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
21fa0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
21fb0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
21fc0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
21fd0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
21fe0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
21ff0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
22000 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
22010 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
22020 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
22030 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
22040 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
22050 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
22060 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
22070 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
22080 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
22090 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
220a0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
220b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
220c0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
220d0 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
220e0 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c  array must be al
220f0 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20  located because 
22100 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a  eOp!=2.        *
22110 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d  * here.  If eOp=
22120 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d  =2, then offset=
22130 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e  =0 and this bran
22140 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65  ch is never take
22150 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
22160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f        assert( eO
22170 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  p!=2 );.        
22180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75  assert( pCur->cu
22190 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
221a0 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20  lidOvfl );.     
221b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
221c0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
221d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
221e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
221f0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
22200 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22210 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
22220 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
22230 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
22240 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
22250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
22260 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
22270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22280 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
22290 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
222a0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
222b0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
222c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
222d0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
222e0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
222f0 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
22300 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
22310 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
22320 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
22330 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
22340 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
22350 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
22360 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
22370 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
22380 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
22390 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
223a0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
223b0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
223c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
223d0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
223e0 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
223f0 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
22400 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
22410 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
22420 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
22430 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
22440 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
22450 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
22460 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
22470 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
22480 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
22490 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
224a0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
224b0 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
224c0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
224d0 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
224e0 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
224f0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
22500 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
22510 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
22520 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
22530 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
22540 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
22550 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
22560 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
22570 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
22580 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
22590 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
225a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
225b0 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
225c0 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
225d0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
225e0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
225f0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
22600 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
22610 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
22620 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
22630 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
22640 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
22650 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
22660 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
226a0 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
226b0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
226e0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
226f0 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
22700 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
22730 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
22740 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
22750 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22770 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
22780 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
22790 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
227a0 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
227b0 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
227c0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
227d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
227e0 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20  [19]==0x01      
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
22810 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22820 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
22830 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
22840 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
22850 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22860 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
22870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
22880 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
22890 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
228a0 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
228b0 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
228c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
228d0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
228e0 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
228f0 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
22900 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
22910 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
22920 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
22930 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
22940 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
22950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22960 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
22970 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
22980 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
22990 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70             ((eOp
229a0 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45  &0x01)==0 ? PAGE
229b0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
229c0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
229d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
229e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
229f0 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
22a00 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
22a10 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
22a20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22a30 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
22a40 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
22a50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22a60 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
22a70 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
22a80 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26  , pBuf, a, (eOp&
22a90 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b  0x01), pDbPage);
22aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
22ab0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
22ac0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22ad0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
22ae0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
22b00 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
22b10 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
22b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
22b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22b40 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
22b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22b60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22b80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
22b90 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
22ba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
22bb0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
22bc0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
22bd0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
22be0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
22bf0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
22c00 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
22c10 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
22c20 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
22c30 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
22c40 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
22c50 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
22c60 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
22c70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22c80 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
22c90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
22ca0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
22cb0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
22cc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
22cd0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
22ce0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
22cf0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
22d00 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
22d10 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
22d20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22d30 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
22d40 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
22d50 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22d60 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22d70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22d80 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22d90 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
22da0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22db0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
22dc0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22dd0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
22de0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22df0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
22e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22e10 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
22e20 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
22e30 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
22e40 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
22e50 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
22e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
22e70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
22e80 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22e90 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
22ea0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
22eb0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
22ec0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
22ed0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
22ee0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
22ef0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
22f00 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22f10 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
22f20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
22f30 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
22f40 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
22f50 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
22f60 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
22f70 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
22f80 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
22f90 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
22fa0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
22fb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22fc0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
22fd0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
22fe0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
22ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23000 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
23010 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23020 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
23030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23040 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
23050 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
23060 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23070 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
23080 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
23090 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
230a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
230b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
230c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
230d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
230e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
230f0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
23100 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23110 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
23120 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
23130 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
23140 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23150 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
23160 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
23170 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
23180 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
23190 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
231a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
231b0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
231c0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
231d0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
231e0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
231f0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
23200 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
23210 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
23220 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
23230 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
23240 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
23250 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
23260 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
23270 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
23280 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
23290 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
232a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
232b0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
232c0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
232d0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
232e0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
232f0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
23300 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
23310 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
23320 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
23330 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
23340 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
23350 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
23360 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
23370 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
23380 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
23390 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
233a0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
233b0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
233c0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
233d0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
233e0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
233f0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
23400 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
23410 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
23420 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
23430 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
23440 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
23450 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
23460 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
23470 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
23480 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
23490 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
234a0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
234b0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
234c0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
234d0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
234e0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
234f0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
23500 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
23510 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
23520 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
23530 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
23540 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
23550 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
23560 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
23570 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
23580 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
23590 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
235a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
235b0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
235c0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
235d0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
235e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
235f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
23600 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
23610 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ere */.){.  asse
23620 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
23630 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
23640 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23650 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
23660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23670 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23680 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
23690 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
236a0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
236b0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
236c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
236d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
236e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
236f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23700 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
23710 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23720 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
23730 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
23740 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74  ize>0 );.  *pAmt
23750 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
23760 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28  ocal;.  return (
23770 76 6f 69 64 2a 29 28 70 43 75 72 2d 3e 69 6e 66  void*)(pCur->inf
23780 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
23790 69 6e 66 6f 2e 6e 48 65 61 64 65 72 29 3b 0a 7d  info.nHeader);.}
237a0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
237b0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
237c0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
237d0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
237e0 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
237f0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
23800 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
23810 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
23820 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
23830 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
23840 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
23850 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
23860 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
23870 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
23880 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
23890 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
238a0 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
238b0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
238c0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
238d0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
238e0 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
238f0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
23900 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
23910 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
23920 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
23930 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
23940 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
23950 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
23960 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
23970 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
23980 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
23990 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
239a0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
239b0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
239c0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
239d0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
239e0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
239f0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
23a00 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
23a10 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
23a20 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
23a30 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
23a40 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
23a50 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
23a60 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
23a70 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
23a80 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
23a90 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
23aa0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
23ab0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23ac0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
23ad0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
23ae0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
23af0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
23b00 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
23b10 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
23b20 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
23b30 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
23b40 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
23b50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
23b60 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
23b70 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
23b80 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
23b90 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
23ba0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
23bb0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
23bc0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
23bd0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
23be0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
23bf0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
23c00 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
23c10 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
23c20 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
23c30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
23c40 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
23c50 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
23c60 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
23c70 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
23c80 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23c90 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
23ca0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23cb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23cd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23ce0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
23cf0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
23d00 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
23d10 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
23d20 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23d30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
23d40 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
23d50 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
23d60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23d70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23d80 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
23d90 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
23da0 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
23db0 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
23dc0 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
23dd0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
23de0 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
23df0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
23e00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
23e10 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
23e20 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
23e30 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
23e40 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
23e50 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
23e60 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
23e70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
23e80 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
23e90 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
23ea0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
23eb0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
23ec0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
23ed0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
23ee0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
23ef0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
23f00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23f10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
23f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23f30 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  .}..#if 0./*.** 
23f40 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
23f50 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
23f60 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
23f70 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
23f80 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
23f90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
23fa0 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
23fb0 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
23fc0 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
23fd0 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
23fe0 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
23ff0 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
24000 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
24010 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
24020 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
24030 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
24040 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
24050 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
24060 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
24070 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
24080 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
24090 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
240a0 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
240b0 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
240c0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
240d0 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
240e0 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
240f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
24100 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
24110 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
24120 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
24130 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
24140 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
24150 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
24160 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
24170 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
24180 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
24190 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
241a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
241b0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
241c0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
241d0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
241e0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
241f0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
24200 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
24210 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
24220 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
24230 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
24240 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
24250 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
24260 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
24270 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
24280 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
24290 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
242a0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
242b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
242c0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
242d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
242e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
242f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24300 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24310 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24320 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
24330 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
24340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24350 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24360 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20  iPage] );..  /* 
24370 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63  UPDATE: It is ac
24380 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
24390 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  for the conditio
243a0 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20  n tested by the 
243b0 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f  assert.  ** belo
243c0 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69  w to be untrue i
243d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
243e0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
243f0 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69  This can occur i
24400 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f  f.  ** one curso
24410 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70  r has modified p
24420 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c  age pParent whil
24430 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
24440 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a   it is held .  *
24450 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75  * by a second cu
24460 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20  rsor. Which can 
24470 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61  only happen if a
24480 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20   single page is 
24490 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  linked.  ** into
244a0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
244b0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
244c0 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
244d0 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30  abase.  */.#if 0
244e0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
244f0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
24500 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24510 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
24520 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24530 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
24540 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24550 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
24560 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63  ;.#endif.  testc
24570 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
24580 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
24590 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
245a0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
245b0 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61  Cell );..  relea
245c0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
245d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
245e0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
245f0 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
24600 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
24610 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
24620 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
24630 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
24640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24650 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
24660 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
24670 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
24680 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
24690 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
246a0 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
246b0 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
246c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
246d0 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
246e0 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
246f0 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
24700 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
24710 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
24720 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
24730 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
24740 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
24750 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
24760 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
24770 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
24780 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
24790 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
247a0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
247b0 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
247c0 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
247d0 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
247e0 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
247f0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
24800 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
24810 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
24820 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
24830 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
24840 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
24850 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
24860 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
24870 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
24880 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
24890 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
248a0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
248b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
248c0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
248d0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
248e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
248f0 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
24900 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
24910 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
24920 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
24930 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
24940 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
24950 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
24960 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
24970 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
24980 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
24990 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
249a0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
249b0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
249c0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
249d0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
249e0 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
249f0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
24a00 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
24a10 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
24a20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
24a30 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
24a40 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
24a50 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
24a60 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
24a70 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
24a80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24a90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
24aa0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
24ab0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
24ac0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24ad0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24ae0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
24af0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
24b00 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24b10 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24b20 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
24b30 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24b40 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
24b50 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
24b60 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
24b70 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
24b80 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
24b90 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
24ba0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
24bb0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
24bc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24bd0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
24be0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
24bf0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
24c00 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
24c10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
24c20 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
24c30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
24c40 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
24c50 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
24c60 69 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50  iPage ) releaseP
24c70 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
24c80 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
24c90 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
24ca0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
24cb0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
24cc0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24cd0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
24ce0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
24cf0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  lse{.    rc = ge
24d00 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
24d10 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
24d20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
24d30 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
24d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24d50 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
24d60 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
24d70 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
24d80 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
24d90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24db0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24dc0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24dd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
24df0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
24e00 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
24e10 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
24e20 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
24e30 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
24e40 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
24e50 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
24e60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
24e70 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
24e80 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
24e90 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
24ea0 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
24eb0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
24ec0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
24ed0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
24ee0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
24ef0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
24f00 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
24f10 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
24f20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
24f30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
24f40 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
24f50 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
24f60 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
24f70 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
24f80 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
24f90 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
24fa0 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
24fb0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
24fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
24fd0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
24fe0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
24ff0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
25000 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
25010 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
25020 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
25030 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
25040 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
25050 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
25060 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
25070 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
25080 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
25090 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
250a0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
250b0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
250c0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
250d0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
250e0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
250f0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
25100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25120 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
25130 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
25140 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
25150 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
25160 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
25170 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
25180 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
25190 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
251a0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
251b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
251c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
251d0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
251e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
251f0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
25200 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
25210 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
25220 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25230 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
25240 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
25250 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
25260 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
25270 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25280 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
25290 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
252a0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
252b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
252c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
252d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
252e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
252f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
25300 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
25310 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
25320 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
25330 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
25340 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
25350 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
25360 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
25370 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
25380 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
25390 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
253a0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
253b0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
253c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
253d0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
253e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
253f0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
25400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25410 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
25420 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25430 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25440 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25450 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25460 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25470 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25480 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
25490 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
254a0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
254b0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
254c0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
254d0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
254e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
254f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
25500 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
25510 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25520 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
25530 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25540 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
25550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25560 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
25570 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
25580 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
25590 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
255a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
255b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
255c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
255d0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
255e0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
255f0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
25600 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
25610 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
25620 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
25630 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
25640 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
25650 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
25660 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
25670 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
25680 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
25690 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
256a0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
256b0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
256c0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
256d0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
256e0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
256f0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
25700 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
25710 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
25720 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
25730 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
25740 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
25750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
25760 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
25770 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25780 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25790 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
257a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
257b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
257c0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
257d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
257e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
257f0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
25800 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
25810 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
25820 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25830 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25840 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
25850 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
25860 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25870 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
25880 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
25890 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
258a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
258b0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
258c0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
258d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
258e0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
258f0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25900 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
25910 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
25920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25930 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25940 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
25950 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
25960 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
25970 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
25980 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
25990 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
259a0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
259b0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
259c0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
259d0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
259e0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
259f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
25a00 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
25a10 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
25a20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25a30 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25a40 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25a50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25a60 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25a70 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25a80 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
25a90 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
25aa0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25ac0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25ad0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
25ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25af0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25b00 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25b10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25b20 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
25b30 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
25b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
25b50 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
25b60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25b70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
25b80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25b90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
25ba0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
25bb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25bc0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
25bd0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
25be0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
25bf0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
25c00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
25c10 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
25c20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
25c30 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
25c40 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
25c50 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
25c60 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
25c70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
25c80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25c90 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
25ca0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
25cb0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
25cc0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
25cd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25ce0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25cf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25d00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
25d10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
25d20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
25d30 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
25d40 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
25d50 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
25d60 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
25d70 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
25d80 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
25d90 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25da0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
25db0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
25dc0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
25dd0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
25de0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
25df0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
25e00 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
25e10 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
25e20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
25e30 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
25e40 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
25e50 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
25e60 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
25e70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
25e80 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
25e90 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
25ea0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
25eb0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25ec0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
25ed0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25ee0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25ef0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
25f00 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
25f10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
25f20 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
25f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25f40 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
25f50 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
25f60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
25f80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
25f90 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
25fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25fb0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
25fc0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
25fd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25fe0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
25ff0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
26000 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
26010 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
26020 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
26030 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
26040 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
26050 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
26060 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26080 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
26090 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
260a0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
260b0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
260c0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
260d0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
260e0 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
260f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26100 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
26110 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
26120 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
26130 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
26140 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
26150 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
26160 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
26170 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
26180 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
26190 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
261a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
261b0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
261c0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
261d0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
261e0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
261f0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
26200 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
26210 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
26220 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
26230 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
26240 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
26250 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
26260 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
26270 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
26280 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
26290 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
262a0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
262b0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
262c0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
262d0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
262e0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
262f0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
26300 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
26310 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
26320 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
26330 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
26340 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
26350 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
26360 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
26370 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
26380 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
26390 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
263a0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
263b0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
263c0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
263d0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
263e0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
263f0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
26400 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
26410 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
26420 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
26430 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
26440 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
26450 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
26460 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
26470 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
26480 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
26490 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
264a0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
264b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
264c0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
264e0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
264f0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
26500 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
26510 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
26520 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
26530 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
26540 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
26550 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
26560 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
26570 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
26580 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
26590 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
265a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
265b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
265c0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
265d0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
265e0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
265f0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
26600 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
26610 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
26620 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
26630 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
26640 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
26650 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
26660 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
26670 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
26680 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
26690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
266a0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
266b0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
266c0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
266d0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
266e0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
266f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26700 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26710 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26720 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
26730 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
26740 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26750 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
26760 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
26770 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
26780 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
26790 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
267a0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
267b0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
267c0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
267d0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
267e0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
267f0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
26800 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
26810 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26820 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
26830 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
26840 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
26850 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70  0.   && pCur->ap
26860 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
26870 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
26880 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
26890 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
268a0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
268b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
268c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
268d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
268e0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
268f0 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0 && pCur->info.
26900 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
26910 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
26920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
26940 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
26950 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
26960 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
26970 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
26980 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
26990 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
269a0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
269b0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
269c0 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
269d0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
269e0 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
269f0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
26a00 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
26a10 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
26a20 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
26a30 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
26a40 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
26a50 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
26a60 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
26a70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
26a80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26a90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
26aa0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
26ab0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26ac0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
26ad0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
26ae0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
26af0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26b00 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
26b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26b20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26b30 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
26b40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26b50 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
26b60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
26b70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
26b80 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
26b90 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
26ba0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26bb0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26bc0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26bd0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
26be0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26bf0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
26c00 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
26c10 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
26c20 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
26c30 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
26c40 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
26c50 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
26c60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
26c70 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26c80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26c90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
26cc0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
26cd0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
26ce0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
26cf0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
26d00 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
26d10 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
26d20 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
26d30 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
26d40 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
26d50 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
26d60 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
26d70 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
26d80 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
26d90 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
26da0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
26db0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
26dc0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
26dd0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
26de0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
26df0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
26e00 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
26e10 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
26e20 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
26e30 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
26e40 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
26e50 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
26e60 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
26e70 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
26e80 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
26e90 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
26ea0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
26eb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
26ec0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
26ed0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
26ee0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
26ef0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
26f00 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
26f10 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
26f20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
26f30 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
26f40 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
26f50 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
26f60 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
26f70 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
26f80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26f90 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
26fa0 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
26fb0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
26fc0 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
26fd0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
26fe0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
26ff0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
27000 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
27010 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
27020 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
27030 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
27040 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
27050 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c  ( 0x80 <= *(pCel
27060 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l++) ){.        
27070 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
27080 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
27090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
270a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
270b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
270c0 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
270d0 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
270e0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
270f0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
27100 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
27110 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
27120 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
27130 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
27140 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
27150 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27160 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
27170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
27180 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
27190 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
271a0 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
271b0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
271c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
271d0 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
271e0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
271f0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
27200 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
27210 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
27220 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
27230 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
27240 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
27250 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27260 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
27270 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
27280 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
27290 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
272a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
272b0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
272c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
272d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
272e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
272f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27300 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
27310 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
27320 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
27330 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27340 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
27350 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
27360 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
27370 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
27380 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
27390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
273a0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b  se{.      for(;;
273b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
273c0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
273d0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
273e0 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
273f0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
27400 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
27410 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
27420 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
27430 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
27440 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
27450 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
27460 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
27470 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
27480 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
27490 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
274a0 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
274b0 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
274c0 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
274d0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
274e0 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
274f0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
27500 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
27510 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
27520 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
27530 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
27540 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
27550 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
27560 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
27570 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
27580 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
27590 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
275a0 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
275b0 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
275c0 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
275d0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
275e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
275f0 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
27600 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
27610 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
27620 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
27630 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
27640 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
27650 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
27660 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
27670 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
27680 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
27690 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
276a0 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
276b0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
276c0 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
276d0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
276e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
276f0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
27700 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
27710 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
27720 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
27730 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
27740 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 2c  ell[1], pIdxKey,
27750 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
27760 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
27770 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
27780 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
27790 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
277a0 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
277b0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
277c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
277d0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
277e0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
277f0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
27800 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
27810 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
27820 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
27830 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
27840 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
27850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
27860 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
27870 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
27880 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
27890 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
278a0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
278b0 5b 32 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30 29  [2], pIdxKey, 0)
278c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
278d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
278e0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
278f0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
27900 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
27910 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
27920 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
27930 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
27940 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
27950 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
27960 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
27970 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
27980 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
27990 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
279a0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
279b0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
279c0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
279d0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
279e0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
279f0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
27a00 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
27a10 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
27a20 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
27a30 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
27a40 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
27a50 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
27a60 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
27a70 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
27a80 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
27a90 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
27aa0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
27ab0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
27ac0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
27ad0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
27ae0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
27af0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
27b00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
27b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
27b20 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
27b30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27b40 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
27b50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27b60 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27b70 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
27b80 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
27b90 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
27ba0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
27bb0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
27bc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27bd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27be0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
27bf0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27c00 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
27c30 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
27c40 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
27c50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
27c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
27c70 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
27c80 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
27c90 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
27ca0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
27cb0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
27cc0 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
27cd0 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
27ce0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
27cf0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
27d00 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
27d10 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
27d20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
27d30 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
27d40 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
27d50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27d60 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
27d70 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
27d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
27da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27db0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27dc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27dd0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
27de0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27df0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
27e00 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
27e10 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
27e20 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
27e30 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
27e40 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27e50 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
27e60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
27e70 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
27e80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27e90 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
27ea0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
27eb0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
27ec0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
27ed0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
27ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
27ef0 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
27f00 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
27f10 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
27f20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
27f30 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
27f40 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
27f50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27f60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27f70 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27f80 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27f90 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
27fa0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27fb0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27fc0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
27fd0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
27fe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27ff0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
28000 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
28010 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
28020 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
28030 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
28040 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
28050 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28060 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28070 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
28080 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
28090 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
280a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
280b0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
280c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
280d0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
280e0 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
280f0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
28100 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
28110 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
28120 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
28130 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28140 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
28150 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
28160 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28170 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
28180 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
28190 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
281a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
281b0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
281c0 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
281d0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
281e0 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
281f0 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
28200 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
28210 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
28220 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
28230 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
28240 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
28250 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
28260 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
28270 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
28280 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
28290 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
282a0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
282b0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
282c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
282d0 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
282e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
282f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28300 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
28310 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
28320 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
28330 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
28340 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
28350 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
28360 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
28370 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
28380 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
28390 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
283a0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
283b0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
283c0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
283d0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
283e0 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
283f0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
28400 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
28410 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
28420 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
28430 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
28440 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
28450 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
28460 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
28470 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
28480 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
28490 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
284a0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
284b0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
284c0 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
284d0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
284e0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
284f0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
28500 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
28510 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
28520 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
28530 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
28540 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
28550 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
28560 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
28570 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
28580 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
28590 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
285a0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
285b0 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
285c0 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
285d0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
285e0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
285f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
28600 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
28610 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
28620 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
28630 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
28640 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
28650 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
28660 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
28670 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
28680 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
28690 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
286a0 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
286b0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
286c0 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
286d0 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
286e0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
286f0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
28700 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
28710 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
28720 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
28730 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
28740 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
28750 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
28760 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
28770 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
28780 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
28790 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
287a0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
287b0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
287c0 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
287d0 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
287e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
287f0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
28800 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
28810 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
28820 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
28830 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
28840 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
28850 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
28860 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
28870 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
28880 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28890 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
288a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
288b0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
288c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
288d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
288e0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
288f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28900 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
28910 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28920 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28930 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
28940 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
28950 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
28960 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
28970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
28990 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
289a0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
289b0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
289c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
289d0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
289e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
289f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
28a00 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
28a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28a20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28a30 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
28a40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28a50 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
28a60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28a70 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
28a80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
28a90 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
28aa0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
28ab0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
28ac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28ad0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
28ae0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
28af0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
28b00 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
28b10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28b20 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
28b30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28b40 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
28b50 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
28b60 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
28b70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28b80 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
28b90 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
28ba0 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
28bb0 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
28bc0 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
28bd0 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
28be0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
28bf0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
28c00 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
28c10 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
28c20 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
28c30 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
28c40 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
28c50 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
28c60 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
28c70 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
28c80 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
28c90 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
28ca0 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
28cb0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
28cc0 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
28cd0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
28ce0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
28cf0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
28d00 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
28d10 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
28d20 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
28d30 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28d40 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28d50 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
28d60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
28d70 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
28d80 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
28d90 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
28da0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
28db0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
28dc0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
28dd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
28de0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28df0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28e00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28e10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
28e20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
28e30 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
28e40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
28e50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28e60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
28e70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28e80 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
28e90 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
28ea0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
28eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
28ec0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
28ed0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
28ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
28ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28f00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
28f10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28f20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28f30 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
28f40 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
28f50 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
28f60 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
28f70 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
28f80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
28f90 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
28fa0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
28fb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28fc0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28fd0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
28fe0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
28ff0 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
29000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29010 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
29020 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
29030 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29040 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29050 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
29060 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
29070 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
29080 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a  _ValidOvfl);.  *
29090 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
290a0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
290b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
290c0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
290d0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61  ur, pRes);.  pPa
290e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
290f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
29100 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61    if( (++pCur->a
29110 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29120 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])>=pPage->nCell
29130 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
29140 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29150 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
29160 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
29170 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Res);.  }.  if( 
29180 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
291a0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
291b0 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
291c0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
291d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
291e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
291f0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
29200 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
29210 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
29220 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
29230 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
29240 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
29250 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
29260 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
29270 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
29280 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
29290 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
292a0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
292b0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
292c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
292d0 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
292e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
292f0 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
29300 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
29310 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
29320 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
29330 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
29340 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
29350 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
29360 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
29370 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
29380 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
29390 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
293a0 65 50 72 65 76 69 6f 75 73 28 29 20 68 65 6c 70  ePrevious() help
293b0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
293c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
293d0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
293e0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
293f0 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
29400 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
29410 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
29420 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
29430 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
29440 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
29450 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
29460 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
29470 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
29480 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
29490 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
294a0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
294b0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
294c0 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
294d0 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
294e0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
294f0 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
29500 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
29510 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
29520 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
29530 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
29540 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
29550 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
29560 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
29570 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
29580 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
29590 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
295a0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
295b0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
295c0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
295d0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
295e0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
295f0 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
29600 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
29610 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
29620 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
29630 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
29640 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
29650 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
29660 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
29670 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
29680 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
29690 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
296a0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
296b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
296c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
296d0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
296e0 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
296f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29700 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
29710 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
29720 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29730 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29740 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
29750 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
29760 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
29770 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
29780 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29790 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
297a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
297b0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
297c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
297d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
297e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
297f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
29800 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
29810 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
29820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29840 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29850 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
29860 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
29870 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
29880 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
29890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
298a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
298b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
298c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
298d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
298e0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
298f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29900 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
29910 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29920 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
29930 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
29940 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
29950 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
29960 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
29970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29980 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
29990 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
299a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
299b0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
299c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
299d0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
299e0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
299f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
29a00 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
29a10 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
29a20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
29a30 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
29a40 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
29a50 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
29a60 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
29a70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29a80 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
29a90 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
29aa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29ab0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
29ac0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
29ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
29ae0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
29af0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
29b00 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29b10 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
29b20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
29b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29b40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
29b50 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
29b60 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
29b70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29b80 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
29b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
29ba0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
29bb0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29bc0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
29bd0 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
29be0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29bf0 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
29c00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29c10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
29c20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
29c30 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
29c40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
29c50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
29c60 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
29c70 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
29c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29c90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
29ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
29cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
29cc0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
29cd0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
29ce0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
29cf0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29d00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29d10 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
29d20 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
29d30 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
29d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
29d50 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
29d60 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
29d70 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
29d80 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
29d90 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29da0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
29db0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
29dc0 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
29dd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29de0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29df0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29e00 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
29e10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29e20 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
29e30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29e40 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
29e50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
29e60 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
29e70 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
29e80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29e90 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
29ea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29eb0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
29ec0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
29ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29ee0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
29ef0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
29f00 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
29f10 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
29f20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
29f30 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
29f40 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
29f50 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
29f60 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
29f70 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
29f80 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
29f90 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
29fa0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
29fb0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
29fc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29fd0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
29fe0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
29ff0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2a000 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2a010 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2a020 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2a030 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2a040 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2a050 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
2a060 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
2a070 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
2a080 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
2a090 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
2a0a0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
2a0b0 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
2a0c0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
2a0d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
2a0e0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
2a0f0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
2a100 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
2a110 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
2a120 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
2a130 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
2a140 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
2a150 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
2a160 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
2a170 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
2a180 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
2a190 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
2a1a0 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
2a1b0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
2a1c0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
2a1d0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
2a1e0 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
2a1f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
2a200 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
2a210 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
2a220 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
2a230 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2a240 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
2a250 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2a260 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
2a270 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2a280 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
2a290 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
2a2a0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
2a2b0 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
2a2c0 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
2a2d0 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
2a2e0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2a2f0 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
2a300 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
2a310 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
2a320 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
2a330 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2a340 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2a350 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
2a360 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
2a370 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
2a380 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
2a390 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
2a3a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
2a3b0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
2a3c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
2a3d0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2a3e0 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
2a3f0 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
2a400 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
2a410 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2a420 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
2a430 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
2a440 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
2a450 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
2a460 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
2a470 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
2a480 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
2a490 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
2a4a0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
2a4b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a4c0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2a4d0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
2a4e0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
2a4f0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
2a500 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
2a510 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
2a520 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2a530 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
2a540 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
2a550 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
2a560 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2a570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a580 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
2a590 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a5a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2a5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
2a5c0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
2a5d0 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
2a5e0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2a5f0 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
2a600 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
2a610 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
2a620 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
2a630 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67  nt(pBt);.  n = g
2a640 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2a650 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
2a660 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
2a670 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
2a680 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
2a690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2a6a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
2a6b0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2a6c0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
2a6d0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2a6e0 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
2a6f0 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
2a700 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
2a710 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
2a720 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
2a730 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
2a740 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
2a750 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
2a760 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
2a770 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2a780 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
2a790 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
2a7a0 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
2a7b0 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
2a7c0 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
2a7d0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2a7e0 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
2a7f0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
2a800 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
2a810 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
2a820 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
2a830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a840 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
2a850 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2a860 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
2a870 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
2a880 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2a890 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
2a8a0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
2a8b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a8c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2a8d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2a8e0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2a8f0 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
2a900 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2a910 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a920 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
2a930 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
2a940 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
2a950 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2a960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a970 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2a980 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2a990 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
2a9a0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
2a9b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2a9c0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
2a9d0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
2a9e0 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
2a9f0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
2aa00 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
2aa10 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2aa20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
2aa30 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
2aa40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2aa50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2aa60 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2aa70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2aa80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2aa90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2aaa0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
2aab0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
2aac0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
2aad0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
2aae0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
2aaf0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
2ab00 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
2ab10 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
2ab20 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
2ab30 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
2ab40 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
2ab50 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
2ab60 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
2ab70 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2ab80 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ab90 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
2aba0 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
2abb0 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
2abc0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2abd0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
2abe0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
2abf0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
2ac00 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2ac10 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
2ac20 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
2ac30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
2ac40 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2ac50 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2ac60 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2ac70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2ac80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2ac90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
2aca0 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
2acb0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2acc0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
2acd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
2ace0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2acf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2ad00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2ad10 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ad20 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2ad30 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
2ad40 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
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 67 6f 74 6f   0;.        goto
2ad70 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ad80 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
2ad90 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2ada0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2adb0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
2adc0 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
2add0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2ade0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2adf0 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
2ae00 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
2ae10 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2ae20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
2ae30 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
2ae40 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
2ae50 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
2ae60 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
2ae70 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
2ae80 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
2ae90 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
2aea0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
2aeb0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
2aec0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
2aed0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2aee0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2aef0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
2af00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2af10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2af20 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2af30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2af40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2af50 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2af60 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2af70 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2af80 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2af90 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2afa0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2afb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2afc0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
2afd0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2afe0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2aff0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2b000 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2b010 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2b020 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2b030 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
2b040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
2b050 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
2b060 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
2b070 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2b080 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
2b090 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
2b0a0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
2b0b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b0c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b0d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b0e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b0f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b100 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2b110 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2b120 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2b130 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
2b140 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
2b150 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
2b160 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2b170 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
2b180 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
2b190 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
2b1a0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
2b1b0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
2b1c0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
2b1d0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
2b1e0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2b1f0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
2b200 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b210 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2b220 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
2b230 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2b240 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2b250 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2b260 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b270 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2b280 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2b290 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b2a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2b2b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2b2c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2b2d0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
2b2e0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2b2f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2b300 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2b310 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2b320 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b330 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
2b340 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2b350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b360 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2b370 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2b380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2b390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2b3b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2b3c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2b3d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
2b3e0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
2b3f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2b400 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b410 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2b420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b440 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
2b450 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
2b460 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
2b470 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
2b480 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
2b490 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
2b4a0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
2b4b0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
2b4c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
2b4d0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2b4e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2b4f0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2b500 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
2b510 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
2b520 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2b530 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
2b540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2b550 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
2b560 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
2b570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2b580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b590 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b5a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b5c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b5d0 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
2b5e0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2b5f0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2b600 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
2b610 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
2b620 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b640 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b650 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2b660 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2b670 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2b680 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b690 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
2b6a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2b6b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b6c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2b6d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2b6e0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2b6f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2b700 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2b710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b720 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2b730 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b740 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b750 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b760 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
2b770 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2b780 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2b790 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2b7a0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
2b7b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
2b7c0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
2b7d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b7e0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2b7f0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2b800 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2b810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2b820 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2b830 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
2b840 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2b850 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2b860 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2b870 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2b880 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b890 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b8a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b8b0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2b8c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b8d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2b8f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2b900 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2b910 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2b920 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
2b930 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
2b940 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2b950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b960 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2b970 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2b980 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2b990 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2b9a0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2b9b0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2b9c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
2b9d0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
2b9e0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
2b9f0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
2ba00 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
2ba10 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
2ba20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
2ba30 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
2ba40 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
2ba50 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
2ba60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
2ba70 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
2ba80 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
2ba90 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2baa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2bab0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2bac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bad0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2bae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2baf0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2bb00 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2bb10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2bb20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
2bb30 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
2bb40 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2bb50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2bb60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bb70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bba0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
2bbb0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
2bbc0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2bbd0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2bbe0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
2bbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2bc00 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
2bc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2bc20 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
2bc30 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
2bc40 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
2bc50 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2bc60 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
2bc70 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
2bc80 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2bc90 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
2bca0 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2bcd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bcf0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2bd00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2bd10 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2bd20 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
2bd30 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
2bd40 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2bd50 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2bd60 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
2bd70 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2bd80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2bd90 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2bda0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2bdb0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2bdc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bdd0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2bde0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2bdf0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
2be00 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
2be10 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
2be20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
2be30 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2be40 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
2be50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2be60 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
2be70 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2be80 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
2be90 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2bea0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
2beb0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
2bec0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
2bed0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
2bee0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
2bf10 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
2bf20 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2bf30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bf40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2bf50 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2bf60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2bf70 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
2bf80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2bf90 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
2bfa0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
2bfb0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
2bfc0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
2bfd0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
2bfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bff0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2c000 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
2c010 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
2c020 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
2c030 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2c040 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41 47 45 52   *pPgno) ? PAGER
2c050 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2c060 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2c070 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2c080 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2c090 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
2c0a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c0b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c0d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c0e0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2c0f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2c100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c120 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2c130 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2c140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c160 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2c170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c180 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
2c190 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2c1a0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
2c1b0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
2c1c0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
2c1d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2c1e0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
2c1f0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2c200 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
2c210 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2c220 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2c230 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
2c240 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
2c250 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
2c260 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
2c270 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
2c280 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
2c290 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
2c2a0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
2c2b0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
2c2c0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
2c2d0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
2c2e0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
2c2f0 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
2c300 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
2c310 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
2c320 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
2c330 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2c340 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
2c350 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
2c360 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
2c370 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
2c380 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
2c390 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
2c3a0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
2c3b0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
2c3c0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
2c3d0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
2c3e0 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
2c3f0 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
2c400 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
2c410 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
2c420 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
2c430 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
2c440 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
2c450 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
2c460 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
2c470 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
2c480 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2c490 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2c4a0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
2c4b0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2c4c0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
2c4d0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
2c4e0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
2c4f0 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
2c500 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2c510 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
2c520 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
2c530 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
2c540 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
2c550 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
2c560 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
2c570 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
2c580 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
2c590 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
2c5a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
2c5b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2c5c0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
2c5d0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2c5e0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2c5f0 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
2c600 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
2c610 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
2c620 63 61 74 65 29 29 20 3f 20 50 41 47 45 52 5f 47  cate)) ? PAGER_G
2c630 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2c640 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2c650 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2c660 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2c670 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2c680 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c690 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2c6a0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2c6b0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2c6c0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2c6d0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2c6e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2c6f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2c700 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2c710 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2c720 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2c730 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2c740 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2c750 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2c760 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2c770 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2c780 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2c790 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2c7a0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2c7b0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2c7c0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2c7d0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2c7e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2c7f0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2c800 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2c810 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2c820 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2c830 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2c840 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2c850 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2c860 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2c870 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2c880 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2c890 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2c8a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2c8b0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2c8c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2c8d0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2c8e0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2c8f0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
2c900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c910 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2c920 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c930 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
2c940 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c950 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
2c960 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2c970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c980 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2c990 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2c9a0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2c9b0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
2c9c0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
2c9d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
2c9e0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
2c9f0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
2ca00 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
2ca10 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
2ca20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
2ca30 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2ca40 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ca50 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
2ca60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2ca70 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2ca80 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
2ca90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2caa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2cab0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cac0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2cad0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2cae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2caf0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2cb00 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2cb10 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
2cb20 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2cb30 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
2cb40 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
2cb50 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
2cb60 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2cb70 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2cb80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2cb90 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
2cba0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
2cbb0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2cbc0 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
2cbd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cbe0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
2cbf0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
2cc00 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2cc10 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
2cc20 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2cc30 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
2cc40 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2cc50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2cc60 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2cc70 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
2cc80 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
2cc90 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
2cca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ccb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2ccc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ccd0 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67  riteable((*ppPag
2cce0 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e)->pDbPage) );.
2ccf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cd00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2cd10 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2cd20 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
2cd30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cd40 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
2cd50 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
2cd60 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2cd70 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
2cd80 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
2cd90 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
2cda0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2cdb0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2cdc0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2cdd0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
2cde0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
2cdf0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
2ce00 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
2ce10 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2ce20 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
2ce30 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
2ce40 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
2ce50 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
2ce60 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
2ce70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
2ce80 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
2ce90 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
2cea0 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
2ceb0 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
2cec0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2ced0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
2cee0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
2cef0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
2cf00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2cf10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
2cf20 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
2cf30 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
2cf40 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
2cf50 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
2cf60 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf80 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
2cf90 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
2cfa0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cfc0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2cfd0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2cfe0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
2cff0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
2d000 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
2d010 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
2d020 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2d030 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
2d060 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
2d070 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
2d080 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0a0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2d0b0 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2d0e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2d0f0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
2d100 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2d110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d120 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d130 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
2d140 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
2d150 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
2d160 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
2d170 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
2d180 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
2d190 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
2d1a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
2d1b0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
2d1c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d1d0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
2d1e0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
2d1f0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
2d200 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
2d210 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
2d220 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
2d230 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d240 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2d250 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2d260 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2d270 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
2d280 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2d290 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
2d2a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2d2b0 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
2d2c0 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
2d2d0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2d2e0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
2d2f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
2d300 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
2d310 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2d320 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
2d330 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
2d340 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
2d350 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
2d360 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d370 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
2d380 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d390 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2d3a0 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
2d3b0 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
2d3c0 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
2d3d0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2d3e0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
2d3f0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
2d400 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2d410 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2d420 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
2d430 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
2d440 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2d450 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2d460 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2d470 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
2d480 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2d490 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
2d4a0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
2d4b0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
2d4c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
2d4d0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2d4e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2d4f0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
2d500 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
2d510 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2d520 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2d530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
2d540 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
2d550 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
2d560 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
2d570 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
2d580 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
2d590 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
2d5a0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
2d5b0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
2d5c0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
2d5d0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2d5e0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2d5f0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
2d600 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
2d610 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
2d620 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2d630 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
2d640 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
2d650 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
2d660 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2d670 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
2d680 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
2d690 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
2d6a0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
2d6b0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
2d6c0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
2d6d0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
2d6e0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
2d6f0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
2d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d710 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2d720 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
2d730 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
2d740 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2d750 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2d760 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
2d770 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d780 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2d790 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
2d7a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d7b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
2d7c0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2d7d0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
2d7e0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2d7f0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2d800 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2d810 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
2d820 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
2d830 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2d840 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
2d850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2d860 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d870 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2d880 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2d890 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
2d8a0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2d8b0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
2d8c0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
2d8d0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
2d8e0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2d8f0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
2d900 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
2d910 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
2d920 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
2d930 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2d940 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
2d950 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2d960 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
2d970 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
2d980 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2d990 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
2d9a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2d9b0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
2d9c0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
2d9d0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
2d9e0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
2d9f0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2da00 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
2da10 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
2da20 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
2da30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
2da40 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
2da50 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
2da60 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2da70 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
2da80 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
2da90 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
2daa0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
2dab0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
2dac0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
2dad0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2dae0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
2daf0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
2db00 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
2db10 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2db20 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
2db30 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
2db40 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
2db50 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
2db60 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
2db70 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
2db80 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
2db90 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
2dba0 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
2dbb0 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
2dbc0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
2dbd0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
2dbe0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
2dbf0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
2dc00 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
2dc10 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2dc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2dc30 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2dc40 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2dc50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dc60 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2dc70 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2dc80 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
2dc90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2dca0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
2dcb0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
2dcc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2dcd0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
2dce0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2dcf0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
2dd00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2dd10 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2dd20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2dd30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dd40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
2dd50 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2dd60 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
2dd70 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
2dd80 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
2dd90 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
2dda0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
2ddb0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
2ddc0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2ddd0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2dde0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
2ddf0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
2de00 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
2de10 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
2de20 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
2de30 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
2de40 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
2de50 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
2de60 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2de70 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2de80 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
2de90 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
2dea0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
2deb0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
2dec0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
2ded0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2dee0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
2def0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
2df00 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
2df10 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
2df20 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
2df30 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2df40 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
2df50 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
2df60 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
2df70 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2df80 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2df90 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
2dfa0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2dfb0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
2dfc0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dfd0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2dfe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2dff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2e000 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2e010 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
2e020 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
2e030 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
2e040 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
2e050 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
2e060 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e070 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
2e080 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2e090 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
2e0a0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
2e0b0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2e0c0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
2e0d0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
2e0e0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
2e0f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2e100 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2e110 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
2e120 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2e130 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2e150 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
2e160 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
2e170 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2e180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e190 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
2e1a0 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
2e1b0 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
2e1c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2e1d0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
2e1e0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2e1f0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2e200 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
2e210 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
2e220 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2e230 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e240 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
2e250 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2e260 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
2e270 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
2e280 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
2e290 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
2e2a0 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
2e2b0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2e2c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e2d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e2e0 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ) );.  btreePars
2e2f0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2e300 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2e310 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2e320 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
2e330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2e340 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
2e350 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
2e360 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
2e370 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2e380 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  ( pCell+info.iOv
2e390 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65  erflow+3 > pPage
2e3a0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
2e3b0 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
2e3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2e3d0 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
2e3e0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
2e3f0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
2e400 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
2e410 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
2e420 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2e430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2e440 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
2e450 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
2e460 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2e470 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
2e480 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
2e490 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
2e4a0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
2e4b0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
2e4c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
2e4d0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
2e4e0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
2e4f0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
2e500 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
2e510 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
2e520 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
2e530 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
2e540 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
2e550 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
2e560 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
2e570 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
2e580 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
2e590 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
2e5a0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2e5b0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
2e5c0 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
2e5d0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2e5e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
2e5f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
2e600 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2e610 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2e620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e630 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2e640 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
2e650 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2e660 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
2e670 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
2e680 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
2e690 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e6a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2e6b0 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
2e6c0 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
2e6d0 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
2e6e0 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
2e6f0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
2e700 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
2e710 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
2e720 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2e730 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
2e740 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
2e750 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
2e760 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2e770 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
2e780 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2e790 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
2e7a0 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
2e7b0 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
2e7c0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
2e7d0 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
2e7e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
2e7f0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
2e800 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
2e810 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
2e820 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
2e830 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
2e840 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2e850 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
2e860 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
2e870 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
2e880 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
2e890 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
2e8a0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
2e8b0 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
2e8c0 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
2e8d0 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
2e8e0 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
2e8f0 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
2e900 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
2e910 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
2e920 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
2e930 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2e940 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
2e950 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
2e960 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
2e970 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
2e980 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
2e990 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
2e9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e9b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e9c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e9d0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
2e9e0 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
2e9f0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
2ea00 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
2ea10 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2ea20 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
2ea30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2ea40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ea50 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
2ea60 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
2ea70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ea80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
2ea90 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
2eaa0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
2eab0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
2eac0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
2ead0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
2eae0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
2eaf0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
2eb00 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
2eb10 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
2eb20 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
2eb30 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
2eb40 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
2eb50 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2eb60 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
2eb70 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
2eb80 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
2eb90 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
2eba0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
2ebb0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
2ebc0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
2ebd0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
2ebe0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
2ebf0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
2ec00 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2ec10 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
2ec20 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
2ec30 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
2ec40 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
2ec50 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
2ec60 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
2ec70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2ec80 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
2ec90 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
2eca0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2ecb0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
2ecc0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2ecd0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2ece0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
2ecf0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
2ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2ed10 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
2ed20 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
2ed30 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2ed40 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2ed50 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
2ed60 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
2ed70 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
2ed80 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
2ed90 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
2eda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2edb0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
2edc0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
2edd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
2ede0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2edf0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
2ee00 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
2ee10 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
2ee20 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
2ee30 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
2ee40 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
2ee50 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
2ee60 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2ee70 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
2ee80 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
2ee90 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
2eea0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
2eeb0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
2eec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2eed0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
2eee0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
2eef0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
2ef00 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2ef10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ef20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ef30 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2ef40 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2ef50 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2ef60 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2ef70 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2ef80 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2ef90 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2efa0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2efb0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2efc0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2efd0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2efe0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2eff0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2f000 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2f010 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2f020 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f030 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2f040 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2f050 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2f060 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2f070 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
2f080 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2f090 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
2f0a0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2f0b0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
2f0c0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2f0d0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
2f0e0 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
2f0f0 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
2f100 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
2f110 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
2f120 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2f130 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2f140 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
2f150 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2f160 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2f170 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
2f180 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
2f190 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
2f1a0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
2f1b0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
2f1c0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
2f1d0 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
2f1e0 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
2f1f0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
2f200 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
2f210 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
2f220 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
2f230 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
2f240 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
2f250 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2f260 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
2f270 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
2f280 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
2f290 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
2f2a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f2b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f2c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2f2d0 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
2f2e0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
2f2f0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
2f300 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
2f310 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
2f320 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
2f330 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
2f340 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
2f350 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
2f360 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
2f370 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2f380 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
2f390 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
2f3a0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
2f3b0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2f3c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2f3d0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
2f3e0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
2f3f0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
2f400 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
2f410 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
2f420 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2f430 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2f440 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
2f450 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
2f460 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
2f470 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
2f480 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2f490 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
2f4a0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
2f4b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
2f4c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2f4d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
2f4e0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2f4f0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
2f500 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
2f510 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
2f520 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f530 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2f540 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2f550 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2f560 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
2f570 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
2f580 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
2f590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
2f5a0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
2f5b0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
2f5c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f5d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2f5e0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
2f5f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f600 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
2f610 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2f620 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
2f630 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
2f640 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2f650 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
2f660 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
2f670 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
2f680 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
2f690 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
2f6a0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
2f6b0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
2f6c0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
2f6d0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
2f6e0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
2f6f0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
2f700 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
2f710 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
2f720 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
2f730 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
2f740 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2f750 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2f760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f770 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2f780 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
2f790 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
2f7a0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
2f7b0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
2f7c0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2f7d0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
2f7e0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
2f7f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2f800 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2f810 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
2f820 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f830 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2f840 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f850 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2f860 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
2f870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f880 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2f890 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2f8a0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
2f8b0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
2f8c0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2f8d0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2f8e0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2f8f0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2f900 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2f910 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2f920 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2f930 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2f940 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2f950 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2f960 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2f970 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
2f980 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2f990 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2f9a0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2f9b0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2f9c0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2f9d0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
2f9e0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
2f9f0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
2fa00 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2fa10 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2fa20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2fa30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2fa40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2fa50 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
2fa60 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
2fa70 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
2fa80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2fa90 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
2faa0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
2fab0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
2fac0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
2fad0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2fae0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
2faf0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
2fb00 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
2fb10 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
2fb20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2fb30 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
2fb40 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
2fb50 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
2fb60 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
2fb70 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2fb80 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2fb90 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
2fba0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2fbb0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
2fbc0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2fbd0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2fbe0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2fbf0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
2fc00 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2fc10 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2fc20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2fc30 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2fc40 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
2fc50 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
2fc60 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2fc70 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2fc80 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2fc90 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
2fca0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2fcb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
2fcc0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
2fcd0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
2fce0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2fcf0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2fd00 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2fd10 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2fd20 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2fd30 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
2fd40 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
2fd50 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
2fd60 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
2fd70 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
2fd80 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
2fd90 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
2fda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2fdb0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
2fdc0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
2fdd0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
2fde0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
2fdf0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
2fe00 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
2fe10 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
2fe20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
2fe30 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
2fe40 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
2fe50 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2fe60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
2fe70 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2fe80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2fe90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2fea0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
2feb0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2fec0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
2fed0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
2fee0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
2fef0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
2ff00 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
2ff10 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
2ff20 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
2ff30 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
2ff40 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
2ff50 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
2ff60 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
2ff70 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
2ff80 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
2ff90 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
2ffa0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
2ffb0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
2ffc0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
2ffd0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
2ffe0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
2fff0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
30000 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
30010 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
30020 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
30030 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
30040 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
30050 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
30060 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
30070 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
30080 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
30090 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
300a0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
300b0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
300c0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
300d0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
300e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
300f0 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
30100 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
30110 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
30120 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
30130 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
30140 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
30150 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
30160 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
30170 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
30180 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
30190 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
301a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
301b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
301c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
301d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
301e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
301f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
30200 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
30210 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
30220 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
30230 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
30240 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
30250 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
30260 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
30270 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
30280 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
30290 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
302a0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
302b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
302c0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
302d0 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
302e0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
302f0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
30300 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
30310 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
30320 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
30330 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
30340 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
30350 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
30360 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
30370 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
30380 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
30390 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65  e->nCell--;.  me
303a0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
303b0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
303c0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75 74  l - idx));.  put
303d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
303e0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
303f0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
30400 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
30410 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
30420 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
30430 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
30440 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
30450 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
30460 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
30470 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
30480 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
30490 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
304a0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
304b0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
304c0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
304d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
304e0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
304f0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
30500 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
30510 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
30520 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
30530 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
30540 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
30550 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
30560 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
30570 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
30580 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
30590 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
305a0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
305b0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
305c0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
305d0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
305e0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
305f0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
30600 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
30610 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
30620 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
30630 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
30640 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
30650 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
30660 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
30670 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
30680 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
30690 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
306a0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
306b0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
306c0 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
306d0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
306e0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
306f0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
30700 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
30710 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
30720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30730 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
30740 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
30750 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
30760 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
30770 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
30780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
30790 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
307a0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
307b0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
307c0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
307d0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
307e0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
307f0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
30800 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
30810 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
30820 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
30830 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
30840 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
30850 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
30860 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
30870 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
30880 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
30890 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
308a0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
308b0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
308c0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
308d0 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
308e0 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
308f0 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
30900 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
30910 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
30920 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
30930 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
30940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
30950 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
30960 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
30970 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
30980 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
30990 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
309a0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
309b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
309c0 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
309d0 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
309e0 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
309f0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
30a00 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
30a10 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
30a20 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
30a30 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
30a40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
30a50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
30a60 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
30a70 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
30a80 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
30a90 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
30aa0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
30ab0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
30ac0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
30ad0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
30ae0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
30af0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
30b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30b10 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
30b20 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
30b30 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
30b40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30b50 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
30b60 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
30b70 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
30b80 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
30b90 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
30ba0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
30bb0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
30bc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30bd0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
30be0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
30bf0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
30c00 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
30c10 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
30c20 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
30c30 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
30c40 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
30c50 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
30c60 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
30c70 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
30c80 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
30c90 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
30ca0 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
30cb0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
30cc0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
30cd0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
30ce0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
30cf0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
30d00 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
30d10 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
30d20 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
30d30 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
30d40 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
30d50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
30d60 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
30d70 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
30d80 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
30d90 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
30da0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
30db0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
30dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
30dd0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
30de0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
30df0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
30e00 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
30e10 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
30e20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
30e30 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
30e40 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
30e50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
30e60 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30e70 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
30e80 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
30e90 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
30ea0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
30eb0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
30ec0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
30ed0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
30ee0 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
30ef0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
30f00 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
30f10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30f20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30f30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30f40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30f50 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
30f60 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
30f70 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30f80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30f90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
30fa0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
30fb0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
30fc0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
30fd0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
30fe0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
30ff0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
31000 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
31010 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
31020 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
31030 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
31040 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
31050 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
31060 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
31070 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
31080 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
31090 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
310a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
310b0 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
310c0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
310d0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
310e0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
310f0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
31100 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
31110 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
31120 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
31130 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
31140 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
31150 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
31160 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
31170 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
31180 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
31190 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
311a0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
311b0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
311c0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
311d0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f  .    }.    memmo
311e0 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c  ve(&data[ins+2],
311f0 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64   &data[ins], end
31200 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62  -ins);.    put2b
31210 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
31220 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
31230 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
31240 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
31250 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
31260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31270 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31280 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
31290 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
312a0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
312b0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
312c0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
312d0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
312e0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
312f0 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
31300 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
31310 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
31320 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
31330 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
31340 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
31350 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
31360 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
31370 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
31380 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
31390 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
313a0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
313b0 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
313c0 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
313d0 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
313e0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
313f0 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
31400 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
31410 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
31420 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
31430 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
31440 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
31450 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
31460 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
31470 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
31480 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
31490 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
314a0 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
314b0 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
314c0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
314d0 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
314e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
314f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
31500 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
31510 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ptr;     /* Addr
31520 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
31530 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
31540 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
31550 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
31560 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
31570 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
31580 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
31590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
315a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
315b0 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20   for pPage */.  
315c0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
315d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
315e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
315f0 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
31600 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  on pPage */.  co
31610 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20  nst int nUsable 
31620 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
31630 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61  ableSize; /* Usa
31640 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65  ble size of page
31650 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
31660 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
31670 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
31680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31690 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
316a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
316b0 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
316c0 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45  Cell<=(int)MX_CE
316d0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20  LL(pPage->pBt). 
316e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
316f0 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
31700 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a  ->pBt)<=10921);.
31710 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31720 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31730 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31740 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
31750 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68   that the page h
31760 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72  as just been zer
31770 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28  oed by zeroPage(
31780 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ) */.  assert( p
31790 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
317a0 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
317b0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
317c0 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
317d0 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
317e0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
317f0 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
31800 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
31810 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
31820 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
31830 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61  {.    u16 sz = a
31840 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65  Size[i];.    pCe
31850 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
31860 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a  cellbody -= sz;.
31870 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
31880 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
31890 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
318a0 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
318b0 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
318c0 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
318d0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
318e0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
318f0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
31900 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
31910 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
31920 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
31930 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
31940 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
31950 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
31960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
31970 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
31980 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
31990 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
319a0 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
319b0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
319c0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
319d0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
319e0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
319f0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
31a00 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
31a10 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
31a20 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
31a30 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
31a40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
31a50 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
31a60 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
31a70 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
31a80 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
31a90 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
31aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
31ab0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
31ac0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
31ad0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
31ae0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
31af0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
31b00 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
31b10 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
31b20 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
31b30 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
31b40 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
31b50 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
31b60 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
31b70 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
31b80 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
31b90 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
31ba0 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
31bb0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
31bc0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
31bd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31be0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
31bf0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
31c00 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
31c10 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
31c20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
31c30 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
31c40 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
31c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31c60 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
31c70 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
31c80 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
31c90 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
31ca0 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
31cb0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
31cc0 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
31cd0 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
31ce0 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
31cf0 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
31d00 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
31d10 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
31d20 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
31d30 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
31d40 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
31d50 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
31d60 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
31d70 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
31d80 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
31d90 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
31da0 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
31db0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
31dc0 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
31dd0 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
31de0 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
31df0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
31e00 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
31e10 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
31e20 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
31e30 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
31e40 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
31e50 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
31e60 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
31e70 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
31e80 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
31e90 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
31ea0 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
31eb0 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
31ec0 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
31ed0 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
31ee0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
31ef0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
31f00 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
31f10 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
31f20 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
31f30 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
31f40 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
31f50 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
31f60 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
31f70 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
31f80 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
31f90 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
31fa0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
31fb0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
31fc0 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
31fd0 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
31fe0 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
31ff0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
32000 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
32010 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
32020 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
32030 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
32040 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
32050 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
32060 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
32070 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
32080 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
32090 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
320a0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
320b0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
320c0 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
320d0 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
320e0 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
320f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
32100 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
32110 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
32120 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
32130 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32150 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
32160 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
32170 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
32180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32190 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
321a0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
321b0 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
321e0 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
321f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32200 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
32210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
32220 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32230 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32240 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
32250 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
32260 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
32270 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
32280 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
32290 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
322a0 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
322b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
322c0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  /.  if( pPage->n
322d0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
322e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
322f0 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
32300 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
32310 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
32320 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
32330 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
32340 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
32350 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
32360 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
32370 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
32380 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
32390 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
323a0 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
323b0 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
323c0 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
323d0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
323e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
323f0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
32400 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
32410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32420 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
32430 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
32440 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
32450 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  e->apOvfl[0];.  
32460 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
32470 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
32480 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
32490 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
324a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
324b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
324c0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
324d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
324e0 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
324f0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
32500 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
32510 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
32520 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
32530 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
32540 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
32550 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
32560 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
32570 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
32580 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
32590 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
325a0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
325b0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
325c0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
325d0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
325e0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
325f0 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
32600 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
32610 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
32620 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
32630 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
32640 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
32650 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
32660 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
32670 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
32680 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
32690 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
326a0 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
326b0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
326c0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
326d0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
326e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
326f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
32700 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
32710 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
32720 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
32730 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
32740 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
32750 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
32760 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
32770 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
32780 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
32790 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
327a0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
327b0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
327c0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
327d0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
327e0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
327f0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
32800 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
32810 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
32820 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
32830 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
32840 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
32850 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
32860 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
32870 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
32880 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
32890 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
328a0 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
328b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
328c0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
328d0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
328e0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
328f0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
32900 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
32910 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
32920 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
32930 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
32940 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
32950 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
32960 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
32970 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
32980 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
32990 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
329a0 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
329b0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
329c0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
329d0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
329e0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
329f0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
32a00 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
32a10 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
32a20 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
32a30 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
32a40 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
32a50 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
32a60 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
32a70 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
32a80 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
32a90 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
32aa0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
32ab0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
32ac0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
32ad0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
32ae0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
32af0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
32b00 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
32b10 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
32b20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
32b30 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
32b40 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
32b50 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
32b60 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
32b70 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
32b80 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
32b90 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
32ba0 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
32bb0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
32bc0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
32bd0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
32be0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
32bf0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
32c00 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
32c10 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
32c20 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
32c30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
32c40 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
32c50 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
32c60 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
32c70 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
32c80 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
32c90 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
32ca0 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
32cb0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
32cc0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
32cd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
32ce0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
32cf0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
32d00 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
32d10 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
32d20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
32d30 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
32d40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32d50 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
32d60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
32d70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32d80 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
32d90 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
32da0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
32db0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
32dc0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
32dd0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
32de0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
32df0 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
32e00 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
32e10 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
32e20 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
32e30 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
32e40 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32e50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
32e60 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
32e70 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
32e80 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
32e90 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
32ea0 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
32eb0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
32ec0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
32ed0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
32ee0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
32ef0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32f00 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
32f10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
32f20 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
32f30 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
32f40 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
32f50 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
32f60 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
32f70 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
32f80 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
32f90 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
32fa0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
32fb0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
32fc0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
32fd0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
32fe0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
32ff0 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
33000 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
33010 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
33020 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
33030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33040 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
33050 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
33060 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
33070 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
33080 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
33090 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
330a0 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
330b0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
330c0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
330d0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
330e0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
330f0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
33100 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
33110 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
33120 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
33130 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
33140 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
33150 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
33160 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
33170 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
33180 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
33190 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
331a0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
331b0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
331c0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
331d0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
331e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
331f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
33200 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
33210 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
33220 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
33230 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
33240 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
33250 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
33260 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
33270 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
33280 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
33290 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
332a0 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
332b0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
332c0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
332d0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
332e0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
332f0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
33300 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
33310 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
33320 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
33330 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
33340 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
33350 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
33360 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
33370 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
33380 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
33390 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
333a0 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
333b0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
333c0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
333d0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
333e0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66  ** MemPage.apOvf
333f0 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
33400 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
33410 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
33420 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
33430 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
33440 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
33450 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
33460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
33470 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
33480 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
33490 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
334a0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
334b0 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
334c0 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
334d0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
334e0 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
334f0 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
33500 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
33510 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
33520 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
33530 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
33540 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
33550 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
33560 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
33570 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
33580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33590 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
335a0 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
335b0 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
335c0 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
335d0 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
335e0 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
335f0 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
33600 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
33610 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
33620 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
33630 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
33640 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
33650 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
33660 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
33670 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
33680 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
33690 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
336a0 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
336b0 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
336c0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
336d0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
336e0 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
336f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
33700 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
33710 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
33720 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
33730 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
33740 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
33750 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
33760 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
33770 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
33780 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
33790 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
337a0 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
337b0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
337c0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
337d0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
337e0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
337f0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
33800 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
33810 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
33820 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
33830 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
33840 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
33850 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
33860 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
33870 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
33880 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
33890 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
338a0 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
338b0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
338c0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
338d0 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
338e0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
338f0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
33900 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
33910 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
33920 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
33930 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
33940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33950 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
33960 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
33970 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
33980 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
33990 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
339a0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
339b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
339c0 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
339d0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
339e0 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
339f0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
33a00 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
33a10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
33a20 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
33a30 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
33a40 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
33a50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
33a60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33a70 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
33a80 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
33a90 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
33aa0 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
33ab0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
33ac0 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
33ad0 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
33ae0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
33af0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
33b00 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
33b10 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
33b20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
33b30 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
33b40 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
33b50 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
33b60 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
33b70 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
33b80 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
33b90 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
33ba0 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
33bb0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
33bc0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
33bd0 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
33be0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
33bf0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
33c00 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
33c10 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
33c20 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
33c30 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
33c40 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
33c50 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
33c60 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
33c70 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
33c80 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
33c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
33ca0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
33cb0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
33cc0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
33cd0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
33ce0 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
33cf0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
33d00 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
33d10 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
33d20 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
33d30 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
33d40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
33d50 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
33d60 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
33d70 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
33d80 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
33d90 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
33da0 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
33db0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
33dc0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
33dd0 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
33de0 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
33df0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
33e00 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
33e10 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
33e20 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
33e30 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
33e40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
33e50 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
33e60 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
33e70 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
33e80 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
33e90 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
33ea0 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
33eb0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
33ec0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
33ed0 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
33ee0 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
33ef0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
33f00 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
33f10 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
33f20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
33f30 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
33f40 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
33f50 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
33f60 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
33f70 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
33f80 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
33f90 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
33fa0 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
33fb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
33fc0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
33fd0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
33fe0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
33ff0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
34000 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
34010 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
34020 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
34030 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
34040 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
34050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
34060 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
34070 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
34080 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
34090 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
340a0 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
340b0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
340c0 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
340d0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
340e0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
340f0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
34100 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
34110 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
34120 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
34130 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
34140 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
34150 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
34160 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
34170 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
34180 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
34190 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
341a0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
341b0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
341c0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
341d0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
341e0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
341f0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
34200 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
34210 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
34220 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
34230 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
34240 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
34250 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
34260 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
34270 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
34280 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
34290 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
342a0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
342b0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
342c0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69  ITE_NOMEM..*/.#i
342d0 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
342e0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20  ER) && _MSC_VER 
342f0 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e  >= 1700 && defin
34300 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67  ed(_M_ARM).#prag
34310 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20  ma optimize("", 
34320 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  off).#endif.stat
34330 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
34340 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
34350 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
34360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
34370 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
34380 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
34390 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
343a0 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
343b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
343c0 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
343d0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
343e0 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
34410 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
34420 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
34430 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20   int isRoot,    
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34450 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
34460 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
34470 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c  ge */.  int bBul
34480 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
34490 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
344a0 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
344b0 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c  part of a bulk l
344c0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  oad */.){.  BtSh
344d0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
344e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
344f0 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
34500 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
34510 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34520 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
34530 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
34540 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
34550 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
34560 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
34570 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
34580 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
34590 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
345c0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
345d0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
34600 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
34610 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
34620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34630 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
34640 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34660 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
34670 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
34680 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
34690 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
346a0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
346b0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
346c0 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
346d0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
346e0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
346f0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
34700 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
34710 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
34720 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34730 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
34740 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
34750 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
34760 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
34770 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
34780 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
34790 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
347a0 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
347c0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
347d0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
347e0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
347f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
34800 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
34810 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
34820 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
34830 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
34840 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
34850 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
34860 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
34870 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
34880 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
34890 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
348a0 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
348b0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
348c0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
348d0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
348e0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
348f0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
34900 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
34910 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
34920 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
34930 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
34940 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
34950 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
34960 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
34970 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
34980 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
34990 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
349a0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
349b0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
349c0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
349d0 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
349e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349f0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
34a00 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
34a10 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
34a20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
34a30 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
34a40 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
34a50 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
34a60 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
34a70 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
34a80 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
34a90 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
34aa0 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
34ab0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
34ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
34ad0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
34ae0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
34af0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
34b00 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
34b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
34b30 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
34b40 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
34b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
34b60 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
34b70 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
34b80 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
34b90 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
34ba0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
34bb0 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
34bc0 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
34bd0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
34be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
34bf0 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
34c00 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
34c10 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
34c20 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
34c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
34c40 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
34c50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
34c60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34c70 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
34c80 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
34c90 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
34ca0 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
34cb0 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
34cc0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
34cd0 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
34ce0 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
34cf0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
34d00 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
34d10 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
34d20 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
34d30 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
34d40 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
34d50 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
34d60 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
34d70 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
34d80 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
34d90 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
34da0 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
34db0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
34dc0 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
34dd0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
34de0 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
34df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
34e00 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
34e10 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
34e20 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
34e30 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
34e40 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
34e50 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
34e60 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  0]==iParentIdx )
34e70 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
34e80 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
34e90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
34ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
34eb0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
34ec0 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
34ed0 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
34ee0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
34ef0 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
34f00 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
34f10 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
34f20 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
34f30 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
34f40 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
34f50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
34f60 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
34f70 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
34f80 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
34f90 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
34fa0 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
34fb0 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
34fc0 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
34fd0 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
34fe0 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
34ff0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
35000 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
35010 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
35020 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
35030 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
35040 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
35050 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
35060 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
35070 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
35080 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
35090 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
350a0 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
350b0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
350c0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
350d0 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
350e0 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
350f0 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
35100 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
35110 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
35120 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
35130 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
35140 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
35150 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  nxDiv = 0;.  }el
35160 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
35170 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c  bBulk==0 || bBul
35180 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  k==1 );.    if( 
35190 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351b0 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
351c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
351d0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
351e0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
351f0 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d  i-2+bBulk;.    }
35200 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
35210 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a  rt( bBulk==0 );.
35220 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
35230 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
35240 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c  }.    i = 2-bBul
35250 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20  k;.  }.  nOld = 
35260 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78  i+1;.  if( (i+nx
35270 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
35280 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
35290 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
352a0 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
352b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
352c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
352d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
352e0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
352f0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
35300 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
35310 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
35320 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
35330 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
35340 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
35350 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
35360 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30  no, &apOld[i], 0
35370 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
35380 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
35390 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
353a0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
353b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
353c0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
353d0 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
353e0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
353f0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
35400 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
35410 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
35420 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b  eak;..    if( i+
35430 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
35440 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61  aiOvfl[0] && pPa
35450 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
35460 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
35470 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f  ] = pParent->apO
35480 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67  vfl[0];.      pg
35490 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
354a0 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
354b0 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
354c0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
354d0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
354e0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
354f0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ow = 0;.    }els
35500 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  e{.      apDiv[i
35510 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
35520 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
35530 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
35540 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  );.      pgno = 
35550 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
35560 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
35570 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
35580 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
35590 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  i]);..      /* D
355a0 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f  rop the cell fro
355b0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
355c0 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c  e. apDiv[i] stil
355d0 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20  l points to.    
355e0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69    ** the cell wi
355f0 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c  thin the parent,
35600 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
35610 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64  has been dropped
35620 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
35630 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20  is safe because 
35640 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20  dropping a cell 
35650 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
35660 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
35670 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
35680 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75   it, and this fu
35690 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
356a0 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20  need the first. 
356b0 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
356c0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
356d0 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70  r cell. So the p
356e0 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74  ointer is safe t
356f0 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o use.      ** l
35700 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20  ater on.  .     
35710 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74   **.      ** But
35720 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69   not if we are i
35730 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
35740 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d  mode. In secure-
35750 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20  delete mode,.   
35760 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
35770 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
35780 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
35790 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
357a0 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
357b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
357c0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
357d0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
357e0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
357f0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
35800 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
35810 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
35820 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
35830 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
35840 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
35850 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
35860 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
35870 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
35880 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE ){.        in
35890 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  t iOff;..       
358a0 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50   iOff = SQLITE_P
358b0 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b  TR_TO_INT(apDiv[
358c0 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52  i]) - SQLITE_PTR
358d0 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d  _TO_INT(pParent-
358e0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
358f0 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77   if( (iOff+szNew
35900 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75  [i])>(int)pBt->u
35910 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
35920 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
35930 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35940 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
35950 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
35960 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
35970 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  *));.          g
35980 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
35990 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nup;.        }el
359a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
359b0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
359c0 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d  [iOff], apDiv[i]
359d0 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
359e0 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20         apDiv[i] 
359f0 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  = &aOvflSpace[ap
35a00 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
35a10 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20  aData];.        
35a20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35a30 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
35a40 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
35a50 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
35a60 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  New[i], &rc);.  
35a70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
35a80 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
35a90 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
35aa0 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
35ab0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
35ac0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
35ad0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
35ae0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
35af0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
35b00 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
35b10 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
35b20 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67  /.  k = pBt->pag
35b30 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73  eSize + ROUND8(s
35b40 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
35b50 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
35b60 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
35b70 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b90 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
35ba0 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
35bb0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
35bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35bd0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
35be0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
35bf0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
35c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c10 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
35c20 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20       + k*nOld;  
35c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c50 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65     /* Page copie
35c60 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20  s (apCopy) */.  
35c70 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
35c80 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
35c90 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
35ca0 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
35cb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
35cc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
35cd0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
35ce0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
35cf0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
35d00 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61  axCells];.  aSpa
35d10 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  ce1 = (u8*)&szCe
35d20 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
35d30 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
35d40 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
35d50 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a  pace1) );..  /*.
35d60 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
35d70 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
35d80 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
35d90 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
35da0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
35db0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
35dc0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
35dd0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
35de0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
35df0 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
35e00 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63  ained from aSpac
35e10 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
35e20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
35e30 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
35e40 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
35e50 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
35e60 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
35e70 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
35e80 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
35e90 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
35ea0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
35eb0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
35ec0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
35ed0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
35ee0 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
35ef0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
35f00 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
35f10 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
35f20 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
35f30 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
35f40 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
35f50 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
35f60 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
35f70 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
35f80 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
35f90 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
35fa0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
35fb0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
35fc0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
35fd0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
35fe0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
35ff0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
36000 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
36010 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
36020 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
36030 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
36040 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
36050 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
36060 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
36070 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
36080 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
36090 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
360a0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
360b0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
360c0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
360d0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
360e0 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
360f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
36100 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
36110 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
36120 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
36130 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
36140 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
36150 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
36160 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
36170 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
36180 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36190 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
361a0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
361b0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
361c0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
361d0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
361e0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
361f0 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
36200 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
36210 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
36220 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
36230 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
36240 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
36250 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
36260 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
36270 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
36280 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
36290 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
362a0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
362b0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
362c0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
362d0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
362e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
362f0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
36300 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36310 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
36320 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
36330 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
36340 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
36350 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
36360 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
36370 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
36380 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
36390 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
363a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
363b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
363c0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
363d0 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
363e0 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
363f0 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
36400 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
36410 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
36420 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
36430 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
36440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36450 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
36460 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
36470 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
36480 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
36490 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
364a0 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
364b0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
364c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
364d0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
364e0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
364f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
36500 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
36510 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
36520 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
36530 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
36540 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
36550 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
36560 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
36570 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
36580 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
36590 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
365a0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
365b0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
365c0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
365d0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
365e0 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
365f0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
36600 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
36610 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
36620 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
36630 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
36640 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
36650 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
36660 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
36670 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
36680 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
36690 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
366a0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
366b0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
366c0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
366d0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
366e0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
366f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
36700 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
36710 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
36720 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
36730 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
36740 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
36750 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
36760 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
36770 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
36780 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
36790 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
367a0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
367b0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
367c0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
367d0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
367e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
367f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
36800 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
36810 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
36820 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
36830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
36840 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
36850 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
36860 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
36870 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
36880 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
36890 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
368a0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
368b0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
368c0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
368d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
368e0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
368f0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
36900 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
36910 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
36920 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
36930 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
36940 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
36950 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
36960 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
36970 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
36980 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
36990 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
369a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
369b0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
369c0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
369d0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
369e0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
369f0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
36a00 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
36a10 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
36a20 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
36a30 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
36a40 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
36a50 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
36a60 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
36a70 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
36a80 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
36a90 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
36aa0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
36ab0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
36ac0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
36ad0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
36ae0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
36af0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
36b00 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
36b10 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
36b20 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
36b30 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
36b40 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
36b50 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
36b60 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
36b70 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
36b80 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
36b90 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
36ba0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
36bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
36bc0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
36bd0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
36be0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
36bf0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
36c00 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
36c10 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
36c20 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
36c30 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
36c40 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
36c50 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
36c60 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
36c70 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
36c80 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
36c90 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
36ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
36cb0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
36cc0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
36cd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
36ce0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
36cf0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
36d00 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
36d10 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
36d20 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
36d30 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
36d40 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
36d50 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
36d60 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
36d70 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
36d80 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
36d90 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
36da0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
36db0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
36dc0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
36dd0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
36de0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
36df0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
36e00 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
36e10 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
36e20 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
36e30 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
36e40 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
36e50 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
36e60 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
36e70 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
36e80 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
36e90 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
36ea0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
36eb0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
36ec0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
36ed0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
36ee0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
36ef0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
36f00 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
36f10 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
36f20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
36f30 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
36f40 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
36f50 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
36f60 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
36f70 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
36f80 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
36f90 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
36fa0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
36fb0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
36fc0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
36fd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
36fe0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
36ff0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
37000 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
37010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37020 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
37030 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
37040 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
37050 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
37060 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
37070 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
37080 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
37090 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
370a0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
370b0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
370c0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
370d0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42   .       || (!bB
370e0 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73  ulk && szRight+s
370f0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
37100 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
37110 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
37120 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
37130 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
37140 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
37150 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
37160 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
37170 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
37180 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
37190 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
371a0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
371b0 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
371c0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
371d0 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
371e0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
371f0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
37200 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
37210 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
37220 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
37230 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
37240 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
37250 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
37260 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
37270 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
37280 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
37290 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
372a0 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50  ge..  **.  ** UP
372b0 44 41 54 45 3a 20 20 54 68 65 20 61 73 73 65 72  DATE:  The asser
372c0 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74  t() below is not
372d0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
372e0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
372f0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63  e.  ** file is c
37300 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72  orrupt.  The cor
37310 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruption will be 
37320 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
37330 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a  orted later.  **
37340 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75   in this procedu
37350 72 65 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  re so there is n
37360 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70  o need to act up
37370 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  on it now..  */.
37380 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
37390 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
373a0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
373b0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
373c0 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66  ll==0) );.#endif
373d0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
373e0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
373f0 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
37400 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
37410 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
37420 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
37430 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
37440 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
37450 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
37460 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
37470 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
37480 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
37490 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
374a0 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
374b0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
374c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
374d0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
374e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
374f0 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
37500 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
37510 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
37520 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
37530 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
37540 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
37550 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
37560 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
37570 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
37580 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
37590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
375a0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
375b0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
375c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
375d0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
375e0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
375f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
37600 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
37610 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37620 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
37630 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31  pgno, (bBulk ? 1
37640 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20   : pgno), 0);.  
37650 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
37660 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
37670 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
37680 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
37690 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
376a0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
376b0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
376c0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
376d0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
376e0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
376f0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
37700 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
37710 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
37720 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
37730 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
37740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37760 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
37770 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
37780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
37790 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
377a0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
377b0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
377c0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
377d0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
377e0 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
377f0 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
37800 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
37810 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
37820 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
37830 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
37840 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
37850 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
37860 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
37870 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
37880 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
37890 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
378a0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
378b0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
378c0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
378d0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
378e0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
378f0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
37900 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
37910 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
37920 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
37930 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
37940 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
37950 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
37960 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
37970 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
37980 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
37990 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
379a0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
379b0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
379c0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
379d0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
379e0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
379f0 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
37a00 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
37a10 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
37a20 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
37a30 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
37a40 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
37a50 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
37a60 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
37a70 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
37a80 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
37a90 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
37aa0 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
37ab0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
37ac0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
37ad0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
37ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
37af0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
37b00 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
37b10 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
37b20 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
37b30 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
37b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37b50 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
37b60 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
37b70 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  pT;.      pT = a
37b80 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
37b90 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
37ba0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
37bb0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
37bc0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
37bd0 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
37be0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
37bf0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
37c00 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
37c10 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
37c20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
37c30 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
37c40 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
37c50 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
37c60 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
37c70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
37c80 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
37c90 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
37ca0 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
37cb0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
37cc0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
37cd0 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
37ce0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
37cf0 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
37d00 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
37d10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37d20 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
37d30 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
37d40 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
37d50 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
37d60 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
37d70 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
37d80 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
37d90 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
37da0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
37db0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
37dc0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
37dd0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
37de0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
37df0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
37e00 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
37e10 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
37e20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
37e30 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
37e40 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
37e50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
37e60 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
37e70 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
37e80 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
37e90 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
37ea0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
37eb0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
37ec0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
37ed0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
37ee0 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
37ef0 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
37f00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37f10 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
37f20 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
37f30 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
37f40 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
37f50 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
37f60 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
37f70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
37f80 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
37f90 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
37fa0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
37fb0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
37fc0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
37fd0 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
37fe0 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
37ff0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
38000 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
38010 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
38020 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
38030 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
38040 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
38050 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
38060 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
38070 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
38080 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
38090 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
380a0 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
380b0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
380c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
380d0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
380e0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
380f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
38100 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
38110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
38120 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
38130 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
38140 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
38150 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
38160 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
38170 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
38180 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
38190 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
381a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
381b0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
381c0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
381d0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
381e0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
381f0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
38200 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
38210 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
38220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
38230 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
38240 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
38250 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
38260 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
38270 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
38280 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
38290 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
382a0 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
382b0 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
382c0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
382d0 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
382e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
382f0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
38300 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
38310 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
38320 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
38330 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
38340 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
38350 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
38360 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
38370 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
38380 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
38390 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
383a0 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
383b0 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
383c0 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
383d0 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
383e0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
383f0 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
38400 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
38410 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
38420 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
38430 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
38440 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
38450 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
38460 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
38470 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
38480 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll n