/ Hex Artifact Content
Login

Artifact 9cb1989073502a9d2f18fbb0e7df8ad89dda2dcf:


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 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
11110 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11120 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
11130 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
11140 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
11150 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
11160 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
11170 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
11180 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
11190 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
111a0 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
111b0 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
111c0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
111d0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
111e0 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
111f0 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
11200 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
11210 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
11220 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
11230 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
11240 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
11250 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
11260 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
11270 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
11280 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
11290 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
112a0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
112b0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
112c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
112d0 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
112e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
112f0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
11300 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
11310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11320 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
11330 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
11340 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
11350 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
11360 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
11370 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
11380 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
11390 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
113a0 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
113b0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
113c0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
113d0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
113e0 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
113f0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
11400 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
11410 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
11420 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
11430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11440 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
11450 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
11460 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
11470 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
11480 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
11490 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
114a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
114b0 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
114c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
114d0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
114e0 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
114f0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
11500 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
11510 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
11520 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
11530 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
11540 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
11550 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
11560 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
11570 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11580 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
11590 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
115a0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
115b0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
115c0 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
115d0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
115e0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
115f0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
11600 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
11610 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
11620 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
11630 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
11640 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
11650 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
11660 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
11670 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
11680 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
11690 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
116a0 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
116b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
116c0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
116d0 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
116e0 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
116f0 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
11700 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
11710 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
11720 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
11730 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
11740 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
11750 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
11760 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
11770 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
11780 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
11790 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
117a0 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
117b0 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
117c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
117d0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
117e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
117f0 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
11800 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
11810 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
11820 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
11830 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
11840 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  .    /* One of t
11850 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e  he uses of pBt->
11860 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20  pTmpSpace is to 
11870 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66  format cells bef
11880 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ore.    ** inser
11890 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61  ting them into a
118a0 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63   leaf page (func
118b0 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  tion fillInCell(
118c0 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  )). If.    ** a 
118d0 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  cell is less tha
118e0 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 4 bytes in siz
118f0 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64  e, it is rounded
11900 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20   up to 4 bytes. 
11910 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72     ** by the var
11920 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68  ious routines th
11930 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69  at manipulate bi
11940 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63  nary cells. Whic
11950 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61  h.    ** can mea
11960 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c  n that fillInCel
11970 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c  l() only initial
11980 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32  izes the first 2
11990 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74   or 3.    ** byt
119a0 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c  es of pTmpSpace,
119b0 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69   but that the fi
119c0 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20  rst 4 bytes are 
119d0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20  copied from.    
119e0 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74  ** it into a dat
119f0 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73  abase page. This
11a00 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
11a10 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20   a problem, but 
11a20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63  it.    ** does c
11a30 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20  ause a valgrind 
11a40 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31  error when the 1
11a50 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75   or 2 bytes of u
11a60 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
11a70 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65  ** data is passe
11a80 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c  d to system call
11a90 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20   write(). So to 
11aa0 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72  avoid this error
11ab0 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68  ,.    ** zero th
11ac0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
11ad0 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65  of temp space he
11ae0 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  re.  */.    if( 
11af0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
11b00 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
11b10 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a 20  pSpace, 0, 4);. 
11b20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
11b30 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
11b40 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
11b50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
11b60 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
11b70 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
11b80 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
11b90 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
11ba0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
11bb0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
11bc0 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
11bd0 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
11be0 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
11bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11c00 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
11c10 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
11c20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11c30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11c40 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
11c50 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
11c60 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
11c70 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11c90 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11ca0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11cb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
11cc0 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
11cd0 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
11ce0 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
11cf0 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
11d00 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
11d10 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
11d20 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
11d30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
11d40 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
11d50 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
11d60 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
11d70 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
11d80 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
11d90 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
11da0 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
11db0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
11dc0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
11dd0 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
11de0 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
11df0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
11e00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
11e10 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
11e20 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
11e30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11e40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
11e50 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
11e60 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
11e70 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
11e80 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
11e90 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
11ea0 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
11eb0 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
11ec0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
11ed0 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
11ee0 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
11ef0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
11f00 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
11f10 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
11f20 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
11f30 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
11f40 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
11f50 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
11f60 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
11f70 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
11f80 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
11f90 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
11fa0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
11fb0 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
11fc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
11fd0 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
11fe0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
11ff0 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
12000 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
12010 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
12020 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
12030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12040 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
12050 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
12060 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
12070 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
12080 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
12090 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
120a0 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
120b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
120c0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
120d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
120e0 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
120f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12100 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
12110 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
12120 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
12130 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
12140 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
12150 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
12160 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
12170 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
12180 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
12190 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
121a0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
121b0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
121c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
121d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
121e0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
121f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
12200 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20   allowed in the 
12210 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cache..**.** The
12220 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
12230 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69  of cache pages i
12240 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73  s set to the abs
12250 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  olute.** value o
12260 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78  f mxPage.  If mx
12270 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
12280 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  , the pager will
12290 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e  .** operate asyn
122a0 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20  chronously - it 
122b0 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f  will not stop to
122c0 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20   do fsync()s.** 
122d0 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69  to insure data i
122e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
122f0 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65   disk surface be
12300 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69  fore.** continui
12310 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e  ng.  Transaction
12320 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20  s still work if 
12330 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
12340 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ff,.** and the d
12350 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
12360 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74  e corrupted if t
12370 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63  his program.** c
12380 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20  rashes.  But if 
12390 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
123a0 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
123b0 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61  there is.** an a
123c0 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c  brupt power fail
123d0 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f  ure when synchro
123e0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65  nous is off, the
123f0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75   database.** cou
12400 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ld be left in an
12410 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
12420 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20  d unrecoverable 
12430 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72  state..** Synchr
12440 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64  onous is on by d
12450 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61  efault so databa
12460 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
12470 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79   not.** normally
12480 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74   a worry..*/.int
12490 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
124a0 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
124b0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
124c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
124d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
124e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
124f0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
12500 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
12510 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12520 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
12530 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
12540 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
12550 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12560 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12570 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12580 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
12590 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
125a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
125b0 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
125c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
125d0 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
125e0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
125f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12600 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
12610 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
12620 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
12630 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
12640 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12670 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
12680 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12690 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
126a0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
126b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
126c0 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
126d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
126e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
126f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12700 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12710 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
12720 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
12730 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
12740 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
12750 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
12760 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
12770 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
12780 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
12790 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
127a0 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
127b0 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
127c0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
127d0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
127e0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
127f0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
12800 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
12810 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
12820 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
12830 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
12840 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
12850 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
12860 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
12870 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
12880 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
12890 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
128a0 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
128b0 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
128c0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
128d0 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
128e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
128f0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
12900 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
12910 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
12920 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12930 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
12940 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
12950 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
12960 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
12970 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
12980 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
12990 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
129a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
129b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
129c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
129d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
129e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
129f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
12a00 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
12a10 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
12a20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12a30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12a50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
12a60 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
12a70 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
12a80 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
12a90 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
12aa0 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
12ab0 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
12ac0 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
12ad0 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
12ae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12af0 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
12b00 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
12b10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12b20 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
12b30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12b40 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
12b50 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
12b60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12b70 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
12b80 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
12b90 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
12ba0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
12bb0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
12bc0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12bd0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
12bf0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
12c00 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
12c10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
12c20 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
12c30 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
12c40 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
12c50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
12c60 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
12c70 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
12c80 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
12c90 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
12ca0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
12cb0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
12cc0 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
12cd0 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
12ce0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
12cf0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
12d00 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
12d10 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
12d20 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
12d30 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
12d40 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
12d50 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
12d60 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
12d70 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
12d80 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
12d90 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
12da0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
12db0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
12dc0 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
12dd0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
12de0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
12df0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
12e00 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
12e10 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
12e20 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
12e30 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
12e40 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
12e50 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
12e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
12e70 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
12e80 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
12e90 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
12ea0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
12eb0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
12ec0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
12ed0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
12ee0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
12ef0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
12f00 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
12f10 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
12f20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12f30 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
12f40 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
12f50 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
12f60 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
12f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12f80 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
12f90 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12fa0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
12fb0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
12fc0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
12fd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12fe0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  p);.  if( pBt->b
12ff0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
13000 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
13010 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13020 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
13030 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
13040 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
13050 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
13060 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
13070 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
13080 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
13090 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
130a0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
130b0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
130c0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
130d0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
130e0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
130f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
13100 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13110 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
13120 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
13130 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
13140 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
13150 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
13160 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
13170 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
13180 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
13190 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
131a0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
131b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
131c0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
131d0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
131e0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
131f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
13200 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
13210 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
13220 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
13230 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13240 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13250 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
13260 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13280 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
13290 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
132a0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
132b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
132c0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
132d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
132e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
132f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
13300 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 7c  ITE_HAS_CODEC) |
13310 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
13320 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG)./*.** Th
13330 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
13340 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
13350 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
13360 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
13370 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
13380 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
13390 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
133a0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
133b0 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
133c0 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
133d0 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
133e0 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
133f0 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
13400 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
13410 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
13420 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
13430 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
13440 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
13450 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
13460 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
13470 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
13480 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
13490 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
134a0 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
134b0 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
134c0 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
134d0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
134e0 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
134f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
13500 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
13510 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
13520 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
13530 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
13540 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
13550 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
13560 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13570 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
13580 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
13590 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
135a0 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
135b0 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  leSize;.}.#endif
135c0 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f 43   /* SQLITE_HAS_C
135d0 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44  ODEC || SQLITE_D
135e0 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65  EBUG */..#if !de
135f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13600 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
13610 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
13620 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
13630 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13640 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
13650 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
13660 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
13670 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
13680 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
13690 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
136a0 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
136b0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
136c0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
136d0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
136e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
136f0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
13700 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
13710 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13720 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
13730 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
13740 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
13750 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
13760 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13770 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
13780 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
13790 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
137a0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
137b0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
137c0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
137d0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
137e0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
137f0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
13800 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13810 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
13820 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
13830 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
13840 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13850 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
13860 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
13870 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
13880 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13890 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
138a0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
138b0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
138c0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
138d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
138e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
138f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
13900 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
13910 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
13920 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
13930 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
13940 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
13950 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
13960 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
13970 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
13980 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
13990 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
139a0 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
139b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
139c0 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
139d0 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
139e0 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
139f0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
13a00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13a10 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
13a20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
13a30 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
13a40 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
13a50 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
13a60 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
13a70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13a80 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13a90 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
13aa0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
13ab0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
13ac0 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
13ad0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13ae0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23  .  return b;.}.#
13af0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
13b00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
13b10 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
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 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
13b40 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
13b50 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
13b60 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
13b70 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
13b80 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
13b90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
13ba0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
13bb0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
13bc0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
13bd0 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
13be0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
13bf0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
13c00 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
13c10 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
13c20 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
13c30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13c40 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
13c50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13c60 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
13c70 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
13c80 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
13c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13ca0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
13cb0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
13cc0 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
13cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13ce0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
13cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
13d00 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
13d10 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
13d20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
13d30 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
13d40 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
13d50 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
13d60 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
13d70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
13d80 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13d90 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
13da0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13db0 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
13dc0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13dd0 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
13de0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13df0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13e00 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
13e10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13e20 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
13e30 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
13e40 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
13e50 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
13e60 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
13e70 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
13e80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13e90 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
13ea0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
13eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13ec0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
13ed0 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
13ee0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
13ef0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
13f00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13f10 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
13f20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
13f30 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
13f40 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
13f50 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
13f60 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
13f70 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
13f80 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
13f90 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
13fa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13fb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13fc0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
13fd0 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
13fe0 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
13ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14000 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
14010 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
14020 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
14030 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
14040 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14050 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
14060 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
14070 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
14080 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
14090 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
140a0 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
140b0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
140c0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
140d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
140e0 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
140f0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
14100 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
14110 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
14120 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
14130 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
14140 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
14150 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
14160 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
14170 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
14180 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
14190 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
141a0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
141b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
141c0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
141d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
141e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
141f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
14200 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
14210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
14220 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
14230 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
14240 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
14250 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14260 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
14270 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
14280 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
14290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
142a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
142b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
142c0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
142d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
142e0 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
142f0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
14300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14310 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14320 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
14330 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
14340 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
14350 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14360 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
14370 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
14380 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
14390 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
143a0 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
143b0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
143c0 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
143d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
143e0 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
143f0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
14400 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
14410 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14420 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
14430 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
14440 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
14450 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
14460 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
14470 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
14480 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
14490 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
144a0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
144b0 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
144c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
144d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
144e0 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
144f0 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
14500 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
14510 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
14520 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
14530 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
14540 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14550 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14560 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
14570 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
14580 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
14590 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
145a0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
145b0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
145c0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
145d0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
145e0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
145f0 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
14600 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
14610 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
14620 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14630 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
14640 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
14650 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
14660 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
14670 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
14680 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
14690 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
146a0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
146b0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
146c0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
146d0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
146e0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
146f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
14700 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
14710 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
14720 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
14730 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
14740 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
14750 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
14760 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
14770 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
14780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
14790 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
147a0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
147b0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
147c0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
147d0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
147e0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
147f0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
14800 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
14810 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
14820 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
14830 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
14840 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
14850 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
14860 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
14870 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
14880 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
14890 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
148a0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
148b0 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
148c0 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
148d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
148e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
148f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14900 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
14910 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
14920 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
14930 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14940 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14950 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14960 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
14970 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
14980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
14990 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
149a0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
149b0 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
149c0 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
149d0 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
149e0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
149f0 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
14a00 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
14a10 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
14a20 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
14a30 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
14a40 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
14a50 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
14a60 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
14a70 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
14a80 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
14a90 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
14aa0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
14ab0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
14ac0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
14ad0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
14ae0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14af0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
14b00 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
14b10 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
14b20 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
14b30 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
14b40 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
14b50 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
14b60 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14b70 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
14b80 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
14b90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14ba0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14bb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
14bc0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
14bd0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
14be0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
14bf0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
14c00 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
14c10 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
14c20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
14c30 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
14c40 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
14c50 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
14c60 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
14c70 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
14c80 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
14c90 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
14ca0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
14cb0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
14cc0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
14cd0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
14ce0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
14cf0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
14d00 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
14d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
14d20 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
14d30 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
14d40 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
14d50 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
14d60 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
14d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
14d80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14d90 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
14da0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14db0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
14dc0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
14dd0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
14de0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
14df0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14e00 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
14e10 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
14e20 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
14e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
14e60 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
14e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14e80 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
14e90 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
14ea0 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
14eb0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
14ec0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
14ed0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
14ee0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
14ef0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
14f00 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
14f10 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
14f20 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
14f30 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
14f40 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
14f50 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
14f60 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
14f70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
14f80 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
14f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
14fb0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14fc0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
14fd0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
14fe0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
14ff0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15000 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
15010 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
15020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
15030 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
15040 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
15050 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
15060 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
15070 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
15080 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
15090 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
150a0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
150b0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
150c0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
150d0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
150e0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
150f0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
15100 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
15110 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
15120 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
15130 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
15140 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
15150 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
15160 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
15170 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
15180 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
15190 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
151a0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
151b0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
151c0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
151d0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
151e0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
151f0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
15200 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
15210 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
15220 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
15230 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
15240 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
15250 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
15260 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
15270 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
15280 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
15290 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
152a0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
152b0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
152c0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
152d0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
152e0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
152f0 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
15300 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
15310 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
15320 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
15330 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
15340 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
15350 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
15360 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
15370 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
15380 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
15390 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
153a0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
153b0 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
153c0 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
153d0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
153e0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
153f0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
15400 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
15410 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
15420 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
15430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
15440 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
15450 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
15460 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
15470 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
15480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
15490 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
154a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
154b0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
154c0 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
154d0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
154e0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
154f0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
15500 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
15510 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
15520 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
15530 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
15540 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
15550 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
15560 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
15570 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
15580 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
15590 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
155a0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
155b0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
155c0 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
155d0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
155e0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
155f0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
15600 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
15610 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
15620 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
15630 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
15640 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
15650 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
15660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
15670 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
15680 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
15690 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
156a0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
156b0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
156c0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
156d0 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
156e0 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
156f0 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
15700 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
15710 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
15720 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
15730 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
15740 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
15750 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
15760 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
15770 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
15780 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
15790 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
157a0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
157b0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
157c0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
157d0 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
157e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
157f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
15800 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
15810 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
15820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15830 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
15840 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
15850 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
15860 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
15870 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
15880 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
15890 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
158a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
158b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
158c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
158d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
158e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
158f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
15900 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
15910 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
15920 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
15930 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
15940 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
15950 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
15960 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
15970 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
15980 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
15990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
159a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
159b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
159c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
159d0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
159e0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
159f0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
15a00 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
15a10 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
15a20 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
15a30 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
15a40 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
15a50 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
15a60 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
15a70 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
15a80 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
15a90 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
15aa0 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
15ab0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
15ac0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
15ad0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
15ae0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
15af0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15b00 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
15b10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15b20 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
15b30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15b40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
15b50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
15b60 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
15b70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15b80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
15b90 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
15ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
15bb0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
15bc0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
15bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
15be0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
15bf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
15c00 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
15c10 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
15c20 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
15c30 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
15c40 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
15c50 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
15c60 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
15c70 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
15c80 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
15c90 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
15ca0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
15cb0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
15cc0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
15cd0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
15ce0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
15cf0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
15d00 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
15d10 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
15d20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
15d30 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
15d40 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
15d50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
15d60 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
15d70 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
15d80 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
15d90 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
15da0 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
15db0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
15dc0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
15dd0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
15de0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
15df0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
15e00 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
15e10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
15e30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
15e40 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
15e50 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
15e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15e70 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
15e80 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
15e90 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
15ea0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
15eb0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
15ec0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
15ed0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
15ee0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
15ef0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
15f00 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
15f10 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
15f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
15f40 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
15f50 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
15f60 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
15f70 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
15f80 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
15f90 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
15fa0 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
15fb0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
15fc0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
15fd0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
15fe0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
15ff0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
16000 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16010 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
16020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
16030 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16040 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
16050 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
16060 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
16070 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
16080 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16090 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
160a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
160b0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
160c0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
160d0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
160e0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
160f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
16100 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
16110 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
16120 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
16130 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
16140 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
16150 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
16160 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
16170 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
16180 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
16190 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
161a0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
161b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
161c0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
161d0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
161e0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
161f0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
16200 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
16210 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
16220 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
16230 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
16240 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
16250 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
16260 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
16270 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
16280 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
16290 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
162a0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
162b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
162c0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
162d0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
162e0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
162f0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
16300 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
16310 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
16320 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
16330 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
16340 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
16350 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
16360 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
16370 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
16380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
16390 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
163a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
163b0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
163c0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
163d0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
163e0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
163f0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
16400 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
16410 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
16420 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
16430 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
16440 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
16450 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
16460 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
16470 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
16480 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
16490 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
164a0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
164b0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
164c0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
164d0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
164e0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
164f0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
16500 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
16510 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
16520 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
16530 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
16540 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
16550 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
16560 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
16570 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
16580 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
16590 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
165a0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
165b0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
165c0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
165d0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
165e0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
165f0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
16600 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
16610 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
16620 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
16630 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
16640 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
16650 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
16660 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
16670 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
16680 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
16690 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
166a0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
166b0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
166c0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
166d0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
166e0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
166f0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
16700 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
16710 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
16720 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
16730 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16740 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
16750 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
16760 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
16770 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
16780 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16790 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
167a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
167b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
167c0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
167d0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
167e0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
167f0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
16800 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
16810 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
16820 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
16830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
16840 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
16850 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
16860 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
16870 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
16880 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
16890 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
168a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
168b0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
168c0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
168d0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
168e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
168f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
16900 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
16910 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
16920 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
16930 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
16940 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
16950 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
16960 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
16970 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
16980 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16990 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
169a0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
169b0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
169c0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
169d0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
169e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
169f0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16a00 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
16a10 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
16a20 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
16a30 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
16a40 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
16a50 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
16a60 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
16a70 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
16a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
16a90 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
16aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
16ab0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
16ac0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
16ad0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16ae0 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c  RANS_WRITE).   |
16af0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
16b00 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
16b10 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f  =0.  ){.    pBlo
16b20 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
16b30 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
16b40 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
16b50 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
16b60 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
16b70 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
16b80 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
16b90 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
16ba0 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
16bb0 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
16bc0 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
16bd0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
16be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
16bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16c00 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
16c10 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
16c20 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
16c30 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
16c40 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
16c50 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
16c60 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
16c70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
16c80 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
16c90 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
16ca0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
16cb0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
16cc0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
16cd0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
16ce0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
16cf0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
16d00 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
16d10 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
16d20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
16d30 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
16d40 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
16d50 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
16d60 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
16d70 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
16d80 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16d90 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
16da0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
16db0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
16dc0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
16dd0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
16de0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
16df0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
16e00 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
16e10 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
16e20 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
16e30 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
16e40 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
16e50 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
16e60 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
16e70 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
16e80 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
16e90 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
16ea0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
16eb0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
16ec0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
16ed0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
16ee0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
16ef0 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
16f00 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
16f10 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
16f20 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
16f30 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
16f40 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
16f50 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
16f60 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
16f70 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
16f80 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
16f90 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
16fa0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
16fb0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
16fc0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
16fd0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
16fe0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
16ff0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
17000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
17010 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
17020 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17030 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
17040 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
17050 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17060 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
17070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
17080 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
17090 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
170a0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
170b0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
170c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
170d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
170e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
170f0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
17100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17110 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
17120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17130 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
17140 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17150 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
17160 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
17170 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
17180 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17190 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
171a0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
171b0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
171c0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
171d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
171e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
171f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
17200 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
17210 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
17220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17230 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
17240 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
17250 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
17260 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
17270 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
17280 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
17290 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
172a0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
172b0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
172c0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
172d0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
172e0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
172f0 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
17300 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
17310 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
17320 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
17330 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
17340 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
17350 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
17360 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
17370 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17380 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
17390 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
173a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
173b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
173c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
173d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
173e0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
173f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
17400 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
17410 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
17420 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
17430 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
17440 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
17450 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
17460 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17470 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
17480 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
17490 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
174a0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
174b0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
174c0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
174d0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
174e0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
174f0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
17500 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
17510 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
17520 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
17530 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
17540 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
17550 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
17560 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
17570 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
17580 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
17590 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
175a0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
175b0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
175c0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
175d0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
175e0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
175f0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
17600 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
17610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
17620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
17630 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17640 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
17650 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
17660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
17680 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
17690 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
176a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
176b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
176c0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
176d0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
176e0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
176f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
17700 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
17710 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
17720 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
17730 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
17740 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
17750 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
17760 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
17770 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
17780 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
17790 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
177a0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
177b0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
177c0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
177d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
177e0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
177f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
17800 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
17810 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
17820 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
17830 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17840 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17850 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
17860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17870 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
17880 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
17890 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
178a0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
178b0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
178c0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
178d0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
178e0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
178f0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
17900 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
17910 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
17920 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
17930 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
17940 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
17950 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
17960 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
17990 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
179a0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
179d0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
179e0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
179f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
17a20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
17a30 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
17a40 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
17a50 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
17a60 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
17a70 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
17a80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17a90 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
17aa0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
17ab0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
17ac0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
17ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17ae0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
17af0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
17b00 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
17b10 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
17b20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
17b30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
17b40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
17b50 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
17b60 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
17b70 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
17b80 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
17b90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
17ba0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
17bb0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
17bc0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
17bd0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
17be0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
17bf0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
17c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
17c10 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
17c20 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
17c30 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
17c40 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17c50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17c60 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
17c70 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
17c80 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
17c90 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
17ca0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
17cb0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
17cc0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
17cd0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
17ce0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
17cf0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
17d00 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
17d10 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
17d20 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
17d30 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
17d40 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
17d50 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
17d60 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
17d70 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
17d80 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
17d90 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
17da0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
17db0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
17dc0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
17dd0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
17de0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
17e00 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
17e10 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
17e20 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
17e30 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
17e40 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
17e50 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
17e80 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
17e90 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
17ea0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
17eb0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
17ec0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
17ed0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
17ee0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
17ef0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
17f00 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
17f10 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
17f20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
17f30 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
17f40 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
17f50 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
17f60 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
17f70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
17f80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17f90 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
17fa0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
17fc0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
17fd0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
17fe0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17ff0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
18000 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
18010 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
18020 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
18030 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
18040 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
18050 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
18060 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
18070 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18080 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18090 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
180a0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
180b0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
180c0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
180d0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
180e0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
180f0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
18100 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
18110 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
18120 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
18130 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
18140 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
18150 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
18160 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
18170 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
18180 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18190 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
181a0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
181b0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
181c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
181d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
181e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
181f0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
18200 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
18210 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
18220 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
18230 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
18240 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
18250 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
18260 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
18270 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
18280 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
18290 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
182a0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
182b0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
182c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
182d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
182e0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
182f0 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
18300 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
18310 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
18320 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
18330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18340 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
18350 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
18360 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
18370 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
18380 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
18390 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
183a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
183b0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
183c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
183d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
183e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
183f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
18400 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
18410 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
18420 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
18430 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
18440 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
18450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18460 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
18470 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
18480 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
18490 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
184a0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
184b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
184c0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
184d0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
184e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
184f0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
18500 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
18510 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
18520 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
18530 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
18540 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
18550 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
18560 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
18570 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
18580 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
18590 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
185a0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
185b0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
185c0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
185d0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
185e0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
185f0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
18600 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
18610 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
18620 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
18630 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
18640 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
18650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
18660 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
18670 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
18680 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
18690 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
186a0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
186b0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
186c0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
186d0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
186e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
186f0 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
18700 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
18710 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
18720 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
18730 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
18740 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
18750 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
18760 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
18770 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
18780 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
18790 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
187a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
187b0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
187c0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
187d0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
187e0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
187f0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
18800 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
18810 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
18820 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
18830 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
18840 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
18850 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
18860 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
18870 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18880 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18890 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
188a0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
188b0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
188c0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
188d0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
188e0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
188f0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
18900 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
18910 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
18920 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
18930 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
18940 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
18950 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
18960 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
18970 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
18980 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
18990 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
189a0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
189b0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
189c0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
189d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
189e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
189f0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
18a00 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
18a10 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
18a20 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
18a30 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
18a40 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
18a50 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
18a60 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
18a70 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
18a80 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
18a90 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
18aa0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
18ab0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
18ac0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
18ad0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
18ae0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
18af0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
18b00 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
18b10 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
18b20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
18b30 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
18b40 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
18b50 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
18b60 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
18b70 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
18b80 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
18b90 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
18ba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
18bb0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
18bc0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
18bd0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
18be0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
18bf0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
18c00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
18c40 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
18c50 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
18c60 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
18c70 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
18c80 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
18c90 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
18ca0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
18cb0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
18cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ce0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18d00 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
18d10 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
18d20 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
18d30 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
18d40 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
18d50 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
18d60 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
18d70 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
18d80 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
18d90 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
18da0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
18db0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18dc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
18dd0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
18de0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
18df0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
18e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
18e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18e40 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
18e50 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18e60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18e70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18e80 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
18e90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18ea0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
18eb0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
18ec0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
18ed0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
18ee0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
18ef0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
18f00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18f20 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
18f30 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
18f40 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
18f50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
18f70 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
18f80 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
18f90 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
18fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
18fb0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
18fc0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
18fd0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
18fe0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
18ff0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
19000 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
19010 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
19020 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19030 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
19040 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
19050 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
19060 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
19070 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
19080 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
19090 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
190a0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
190b0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
190c0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
190d0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
190e0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
190f0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
19100 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
19110 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
19120 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
19130 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
19140 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
19150 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
19160 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
19170 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
19180 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
19190 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
191a0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
191b0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
191c0 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
191d0 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
191e0 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
191f0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
19200 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
19210 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
19220 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
19230 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
19240 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
19250 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
19260 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
19270 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
19280 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
19290 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
192a0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
192b0 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
192c0 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
192d0 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
192e0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
192f0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
19300 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
19310 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
19320 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
19330 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
19340 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
19350 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
19360 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
19370 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
19380 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19390 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
193a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
193b0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
193c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
193d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
193e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
193f0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
19400 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
19410 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
19420 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
19430 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
19440 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
19450 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
19460 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
19470 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
19480 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
19490 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
194a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
194b0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
194c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
194d0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
194e0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
194f0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
19500 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
19510 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19540 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
19550 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
19560 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19570 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19580 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
19590 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
195a0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
195b0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
195c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
195d0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
195e0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
195f0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
19600 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
19610 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
19620 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
19630 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
19640 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
19650 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
19660 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
19670 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
19680 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
19690 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
196a0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
196b0 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
196c0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
196d0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
196e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
196f0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
19700 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
19710 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
19720 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
19730 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
19740 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
19750 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
19760 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
19770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
197a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
197b0 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
197c0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
197d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
197e0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
197f0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
19800 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
19810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
19820 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
19830 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
19840 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
19850 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
19860 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
19870 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
19880 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
19890 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
198a0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
198b0 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
198c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
198d0 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
198e0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
198f0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
19900 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
19910 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
19920 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
19930 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19950 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19960 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
19970 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
19980 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
19990 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
199a0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
199b0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
199c0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
199d0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
199e0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
199f0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
19a00 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
19a10 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
19a20 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
19a30 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
19a40 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
19a50 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
19a60 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
19a70 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
19a80 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
19a90 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
19aa0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
19ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
19ac0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
19ad0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
19ae0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
19af0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
19b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19b10 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
19b20 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
19b30 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
19b40 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
19b50 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
19b60 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
19b70 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
19b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
19ba0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
19bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
19bc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
19bd0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
19be0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
19bf0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
19c00 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
19c10 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
19c20 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
19c30 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
19c40 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
19c50 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
19c60 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
19c70 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
19c80 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
19c90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
19ca0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
19cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19cc0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19cd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
19ce0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
19cf0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
19d00 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
19d10 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
19d20 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
19d30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19d40 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
19d50 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
19d60 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
19d70 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
19d80 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
19d90 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
19da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19db0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
19dc0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
19dd0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
19de0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
19df0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
19e00 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
19e10 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
19e20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
19e30 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
19e40 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
19e50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
19e60 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
19e70 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
19e80 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
19e90 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
19ea0 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
19eb0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
19ec0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
19ed0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
19f00 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
19f10 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
19f20 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f40 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
19f50 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
19f60 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
19f70 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
19f80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19f90 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
19fa0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
19fb0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
19fc0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
19fd0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
19fe0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
19ff0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1a000 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1a010 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1a020 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1a030 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1a040 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1a050 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1a060 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1a070 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1a080 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1a090 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1a0a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a0b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1a0c0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1a0d0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1a0e0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1a0f0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1a100 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1a110 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1a120 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1a130 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1a140 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1a150 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1a160 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1a170 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1a180 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1a190 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1a1a0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1a1b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1a1c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1a1d0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1a1e0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1a1f0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1a200 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a210 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1a220 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1a230 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1a240 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1a250 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1a260 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1a270 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a280 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1a290 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1a2a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1a2b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a2c0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1a2d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a2e0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1a2f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1a300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1a310 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1a320 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1a330 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1a340 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1a350 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1a360 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a370 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1a380 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1a390 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1a3a0 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1a3b0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1a3c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a3d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a3e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1a3f0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1a400 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1a410 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1a420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a440 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1a450 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1a460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1a470 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1a480 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1a490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a4a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a4b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1a4c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a4d0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1a4e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1a4f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1a500 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a510 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1a520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a530 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1a540 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1a550 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1a560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a580 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1a590 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1a5a0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1a5b0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1a5c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1a5d0 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1a5e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1a5f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1a600 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1a610 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1a620 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1a630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1a640 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1a650 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1a660 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1a670 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1a680 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1a690 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1a6a0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1a6b0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1a6c0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1a6d0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1a6e0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1a6f0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1a700 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1a710 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1a720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a730 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1a740 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1a750 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1a760 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1a770 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1a780 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
1a790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a7a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1a7b0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1a7c0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1a7d0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1a7e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1a7f0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1a800 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1a810 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1a820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a830 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1a840 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1a850 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1a860 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1a870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1a880 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1a890 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1a8a0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1a8b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1a8c0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1a8d0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1a8e0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1a8f0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1a900 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1a910 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1a920 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1a930 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1a940 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1a950 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1a960 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1a970 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1a980 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1a990 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1a9a0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1a9b0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1a9c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1a9d0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1a9e0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1a9f0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1aa00 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1aa10 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1aa20 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1aa30 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1aa40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1aa50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1aa60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1aa70 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1aa80 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1aa90 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1aaa0 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1aab0 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1aac0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1aad0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1aae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1aaf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1ab00 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1ab10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1ab20 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1ab30 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1ab40 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1ab50 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1ab60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1ab70 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1ab80 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1ab90 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1aba0 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1abb0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1abc0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1abd0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1abe0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1abf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ac00 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1ac10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1ac20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ac30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1ac40 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1ac50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1ac60 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1ac70 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1ac80 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1ac90 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1aca0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1acb0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1acc0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1acd0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1ace0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1acf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1ad00 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1ad10 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1ad20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1ad30 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1ad40 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1ad50 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1ad60 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1ad70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ad80 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1ad90 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1ada0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1adb0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1adc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1add0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1ade0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1adf0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1ae00 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1ae10 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1ae20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1ae30 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1ae40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1ae50 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1ae60 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1ae70 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1ae80 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1ae90 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1aea0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1aeb0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1aec0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1aed0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1aee0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1aef0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1af00 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1af10 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1af20 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1af30 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1af40 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1af50 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1af60 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1af70 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1af80 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1af90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1afa0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1afb0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1afc0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1afd0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1afe0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1aff0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1b000 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1b010 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1b020 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1b030 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1b040 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1b050 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1b060 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1b070 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1b080 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1b090 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1b0a0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1b0b0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1b0c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1b0d0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1b0e0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1b0f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1b100 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1b110 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1b120 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1b130 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1b140 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1b150 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b160 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1b170 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1b180 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1b190 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1b1a0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1b1b0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1b1c0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1b1d0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1b1e0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1b1f0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1b200 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1b210 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1b220 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1b230 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1b240 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1b250 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1b260 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1b270 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1b280 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1b290 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1b2a0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1b2b0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1b2c0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1b2d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1b2e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1b2f0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1b300 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1b310 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b320 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1b330 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1b340 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1b350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b360 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1b370 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1b380 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1b390 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b3a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1b3b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1b3c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b3d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1b3e0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1b3f0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1b400 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1b410 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1b420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b430 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b450 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b460 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b470 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1b480 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1b490 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b4a0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1b4b0 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1b4c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1b4d0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1b4e0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b4f0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1b500 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1b510 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1b520 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1b530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b540 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1b550 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1b560 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1b570 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1b580 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1b590 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1b5a0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1b5b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1b5c0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1b5d0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1b5e0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1b5f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b600 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1b610 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
1b620 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1b630 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1b640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b650 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b660 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1b670 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
1b680 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1b690 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
1b6a0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
1b6b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1b6c0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1b6d0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1b6e0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1b6f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1b700 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1b710 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1b720 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1b730 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1b740 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1b750 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1b760 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1b770 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1b780 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1b790 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1b7a0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1b7b0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1b7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1b7d0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1b7e0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1b7f0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1b800 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1b810 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1b820 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1b830 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1b840 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1b850 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1b860 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1b870 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1b880 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1b890 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b8a0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1b8b0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1b8c0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1b8d0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1b8e0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1b8f0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1b900 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1b910 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1b920 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1b930 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1b940 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1b950 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1b960 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b970 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1b980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b990 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1b9a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1b9b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1b9c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1b9d0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1b9e0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1b9f0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1ba00 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1ba10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1ba20 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1ba30 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1ba40 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1ba50 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1ba60 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1ba70 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1ba80 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1ba90 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1baa0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1bab0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bac0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1bad0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1bae0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1baf0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1bb00 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1bb10 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1bb20 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1bb30 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1bb40 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1bb50 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1bb60 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1bb70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1bb80 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1bb90 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1bba0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1bbb0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1bbc0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1bbd0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1bbe0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1bbf0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1bc00 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1bc10 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1bc20 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1bc30 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1bc40 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1bc50 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1bc60 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1bc70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1bc80 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1bc90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1bca0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1bcb0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1bcc0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1bcd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1bce0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1bcf0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1bd00 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1bd10 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1bd20 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1bd30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1bd40 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1bd50 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1bd60 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1bd70 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1bd80 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1bd90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1bda0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1bdb0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1bdc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1bdd0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1bde0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1bdf0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1be00 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1be10 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1be20 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1be30 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1be40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1be50 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1be60 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1be70 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1be80 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1be90 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1bea0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1beb0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1bec0 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1bed0 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1bee0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1bef0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1bf00 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1bf10 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1bf20 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1bf30 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1bf40 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1bf50 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1bf60 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1bf70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1bf80 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1bf90 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1bfa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bfb0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1bfc0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1bfd0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1bfe0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1bff0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1c000 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1c010 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1c020 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1c030 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1c040 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1c050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c060 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1c070 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1c080 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1c090 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1c0a0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1c0b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1c0c0 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1c0d0 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1c0e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1c0f0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1c100 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1c110 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1c120 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c130 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1c140 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1c150 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1c160 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1c170 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c180 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1c190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1c1a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1c1b0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1c1c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1c1d0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1c1e0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1c1f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1c200 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1c210 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c220 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1c230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c240 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
1c250 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1c260 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1c270 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1c280 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1c290 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1c2a0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1c2b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1c2c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c2d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
1c2e0 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
1c2f0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
1c300 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
1c310 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1c320 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1c330 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1c340 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c350 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1c360 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1c370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1c390 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1c3a0 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  (p, 0);.  }.  sq
1c3b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c3c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c3d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c3e0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1c3f0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
1c400 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
1c410 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
1c420 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
1c430 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
1c440 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
1c450 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
1c460 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1c470 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
1c480 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
1c490 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
1c4a0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
1c4b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1c4c0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
1c4d0 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
1c4e0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
1c4f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c500 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
1c510 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
1c520 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
1c530 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
1c540 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
1c550 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
1c560 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
1c570 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
1c580 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
1c590 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
1c5a0 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
1c5b0 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
1c5c0 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
1c5d0 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
1c5e0 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
1c5f0 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
1c600 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
1c610 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
1c620 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
1c630 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
1c640 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c650 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1c660 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
1c670 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
1c680 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1c690 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20    if( pBtree==0 
1c6a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1c6b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1c6c0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
1c6d0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1c6e0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1c6f0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
1c700 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c710 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1c720 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
1c730 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
1c740 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
1c750 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72  errCode;.    for
1c760 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
1c770 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1c780 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
1c790 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
1c7a0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
1c7b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1c7c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c7d0 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
1c7e0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
1c7f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1c800 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
1c810 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
1c820 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
1c830 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
1c840 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
1c850 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
1c860 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
1c870 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1c880 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
1c890 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
1c8a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
1c8b0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1c8c0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1c8d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c8e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c8f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1c900 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1c910 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1c920 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1c930 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
1c940 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
1c950 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a   int tripCode){.
1c960 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1c970 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c980 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
1c990 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
1c9a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c9b0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1c9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9d0 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1c9e0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1c9f0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  pBt, 0, 0);.  }e
1ca00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1ca10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1ca20 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
1ca30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
1ca40 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1ca50 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a   tripCode);.  }.
1ca60 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1ca70 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
1ca80 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1ca90 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1caa0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
1cab0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
1cac0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1cad0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
1cae0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1caf0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
1cb00 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
1cb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cb20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1cb30 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
1cb40 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1cb50 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
1cb60 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
1cb70 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
1cb80 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
1cb90 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
1cba0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
1cbb0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
1cbc0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
1cbd0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
1cbe0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1cbf0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
1cc00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cc10 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
1cc20 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1cc30 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1cc40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cc50 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
1cc60 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1cc70 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
1cc80 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1cc90 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1cca0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ccb0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
1ccc0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
1ccd0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1cce0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ccf0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
1cd00 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
1cd10 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1cd20 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  , 1)==0 );.    p
1cd30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1cd40 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1cd50 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1cd60 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1cd70 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1cd80 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1cd90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cda0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1cdb0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
1cdc0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
1cdd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1cde0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1cdf0 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c   can can be roll
1ce00 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
1ce10 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
1ce20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1ce30 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
1ce40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1ce50 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
1ce60 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
1ce70 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1ce80 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
1ce90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
1cea0 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
1ceb0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
1cec0 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
1ced0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
1cee0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
1cef0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
1cf00 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
1cf10 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
1cf20 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
1cf30 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
1cf40 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
1cf50 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
1cf60 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
1cf70 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
1cf80 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
1cf90 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
1cfa0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
1cfb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
1cfc0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1cfd0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
1cfe0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
1cff0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
1d000 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
1d010 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
1d020 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
1d030 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
1d040 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
1d050 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1d060 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1d070 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1d080 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
1d090 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
1d0a0 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
1d0b0 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
1d0c0 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
1d0d0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
1d0e0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
1d0f0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
1d100 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
1d110 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
1d120 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
1d130 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
1d140 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
1d150 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
1d160 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
1d170 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
1d180 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
1d190 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1d1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1d1b0 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
1d1c0 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
1d1d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1d1e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d1f0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
1d200 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1d210 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1d220 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1d230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
1d240 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1d250 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
1d260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1d270 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1d280 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1d290 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1d2a0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1d2b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d2c0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1d2d0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1d2e0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1d2f0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1d300 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1d310 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1d320 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1d330 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1d340 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1d350 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1d360 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1d370 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1d380 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1d390 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1d3a0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1d3b0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1d3c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1d3d0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1d3e0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1d3f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d400 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1d410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1d420 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1d430 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d450 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1d460 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1d470 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1d480 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1d490 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1d4a0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1d4b0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1d4c0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1d4d0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1d4e0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1d4f0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1d500 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1d510 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1d520 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1d530 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1d540 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1d550 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1d560 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1d570 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1d580 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1d590 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1d5a0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1d5b0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1d5c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1d5d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1d5e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1d5f0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1d600 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1d610 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1d620 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1d630 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1d640 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1d650 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1d660 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1d670 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1d680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d690 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1d6a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1d6b0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1d6c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d6d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1d6e0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1d6f0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1d700 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d710 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1d720 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1d730 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1d740 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1d750 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1d760 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1d770 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1d780 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1d790 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1d7a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1d7b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1d7c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d7d0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1d7e0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1d7f0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1d800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d810 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1d820 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
1d830 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1d840 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1d850 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1d860 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
1d870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1d880 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1d890 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
1d8a0 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
1d8b0 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
1d8c0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
1d8d0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1d8e0 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
1d8f0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
1d900 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
1d910 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
1d920 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1d930 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
1d940 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1d950 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
1d960 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
1d970 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
1d980 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
1d990 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
1d9a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d9b0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1d9c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d9d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1d9e0 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
1d9f0 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
1da00 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
1da10 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
1da20 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
1da30 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
1da40 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1da50 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
1da60 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
1da70 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
1da80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1da90 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
1daa0 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
1dab0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
1dac0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
1dad0 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
1dae0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
1daf0 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
1db00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1db10 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
1db20 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1db30 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
1db40 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
1db50 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
1db60 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1db70 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
1db80 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
1db90 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
1dba0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
1dbb0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
1dbc0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
1dbd0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
1dbe0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
1dbf0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
1dc00 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
1dc10 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
1dc20 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
1dc30 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
1dc40 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
1dc50 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
1dc60 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
1dc70 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
1dc80 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
1dc90 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
1dca0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
1dcb0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
1dcc0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
1dcd0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
1dce0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
1dcf0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
1dd00 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
1dd10 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
1dd20 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
1dd30 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
1dd40 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
1dd50 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
1dd60 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
1dd70 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
1dd80 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
1dd90 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1dda0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
1ddb0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
1ddc0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
1ddd0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
1dde0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
1ddf0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
1de00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1de10 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
1de20 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
1de30 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
1de40 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
1de50 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
1de60 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
1de70 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
1de80 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
1de90 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
1dea0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1deb0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
1dec0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
1ded0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1dee0 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
1def0 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
1df00 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
1df10 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
1df20 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1df30 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1df40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
1df50 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
1df60 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1df90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1dfa0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfc0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1dfd0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1dfe0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1e010 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1e020 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1e030 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1e040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e050 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
1e060 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1e070 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
1e080 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e0a0 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
1e0b0 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
1e0c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e0d0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1e0e0 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
1e0f0 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
1e100 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e110 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1e120 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
1e130 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1e140 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
1e150 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1e160 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
1e170 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
1e180 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
1e190 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
1e1a0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1e1b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
1e1c0 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
1e1d0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
1e1e0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
1e1f0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1e200 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
1e210 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
1e220 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
1e230 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
1e240 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1e250 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1e260 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
1e270 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
1e280 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
1e290 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
1e2a0 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1e2b0 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
1e2c0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1e2d0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
1e2e0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
1e2f0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
1e300 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1e310 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1e320 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
1e330 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
1e340 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1e350 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1e360 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
1e370 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1e380 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ata );..  if( NE
1e390 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28 70  VER(wrFlag && (p
1e3a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1e3b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1e3c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1e3d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1e3e0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1e3f0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
1e400 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1e410 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
1e420 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
1e430 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
1e440 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1e450 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1e460 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1e470 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1e480 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1e490 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1e4a0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1e4b0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1e4c0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1e4d0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1e4e0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1e4f0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1e500 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1e510 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1e520 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1e530 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1e540 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1e550 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42  ==0 || wrFlag==B
1e560 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b  TCF_WriteFlag );
1e570 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
1e580 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43  s = wrFlag;.  pC
1e590 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
1e5a0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
1e5b0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1e5c0 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1e5d0 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
1e5e0 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
1e5f0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
1e600 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1e610 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
1e620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e630 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e640 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1e650 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1e680 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1e690 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1e6c0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1e6d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1e6e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1e710 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1e720 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1e730 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e750 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
1e760 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
1e770 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e7a0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
1e7b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1e7c0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1e7d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1e7e0 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
1e7f0 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
1e800 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1e810 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1e820 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1e830 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e840 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1e850 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
1e860 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
1e870 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
1e880 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
1e890 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
1e8a0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
1e8b0 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
1e8c0 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
1e8d0 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
1e8e0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
1e8f0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
1e900 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
1e910 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
1e920 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
1e930 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
1e940 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
1e950 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
1e960 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e970 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
1e980 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
1e990 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
1e9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1e9b0 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
1e9c0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
1e9d0 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
1e9e0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
1e9f0 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
1ea00 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
1ea10 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
1ea20 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
1ea30 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
1ea40 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
1ea50 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
1ea60 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
1ea70 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
1ea80 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
1ea90 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
1eaa0 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
1eab0 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
1eac0 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
1ead0 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
1eae0 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
1eaf0 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
1eb00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1eb10 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
1eb20 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
1eb30 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
1eb40 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
1eb50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1eb60 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
1eb70 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1eb80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1eb90 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
1eba0 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
1ebb0 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
1ebc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ebd0 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
1ebe0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
1ebf0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
1ec00 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
1ec10 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1ec20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
1ec30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1ec40 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1ec50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1ec60 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
1ec70 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
1ec80 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  r(pCur);.    if(
1ec90 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
1eca0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
1ecb0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
1ecc0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
1ecd0 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
1ece0 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
1ecf0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
1ed00 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1ed10 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
1ed20 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1ed30 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
1ed40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1ed50 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1ed60 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1ed70 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1ed80 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
1ed90 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1eda0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
1edb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 42 74  qlite3DbFree(pBt
1edc0 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61  ree->db, pCur->a
1edd0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f  Overflow);.    /
1ede0 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1edf0 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1ee00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ee10 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1ee20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1ee40 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1ee50 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1ee60 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1ee70 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1ee80 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1ee90 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1eea0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1eeb0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
1eec0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1eed0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1eee0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1eef0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1ef00 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1ef10 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1ef20 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1ef30 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1ef40 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
1ef50 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1ef60 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1ef70 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1ef80 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1ef90 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1efa0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1efb0 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1efc0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1efd0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1efe0 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1eff0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1f000 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1f010 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1f020 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1f030 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1f040 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1f050 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1f060 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1f070 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1f080 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1f090 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1f0a0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1f0b0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1f0c0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1f0d0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1f0e0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1f0f0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1f100 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1f110 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1f120 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1f130 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1f140 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1f150 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1f160 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1f170 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1f180 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1f190 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1f1a0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1f1b0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1f1c0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1f1d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1f1e0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1f1f0 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
1f200 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1f210 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1f220 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1f230 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1f240 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1f250 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1f260 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1f270 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1f280 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1f290 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1f2a0 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1f2b0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1f2c0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1f2d0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1f2e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1f2f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1f300 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1f310 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1f320 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1f330 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1f340 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1f350 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1f360 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
1f370 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
1f380 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1f390 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1f3a0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1f3b0 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1f3c0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1f3d0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1f3e0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1f3f0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1f400 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1f410 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1f420 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1f430 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1f470 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1f480 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f4c0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1f4d0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f510 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1f520 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1f530 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1f540 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1f550 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20  nfo);        \. 
1f560 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
1f570 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
1f580 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f5b0 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c                 \
1f600 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1f610 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1f660 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
1f670 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
1f680 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
1f690 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1f6a0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1f6b0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
1f6c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1f6d0 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
1f6e0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
1f6f0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
1f700 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
1f710 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
1f720 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
1f730 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
1f740 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
1f750 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
1f760 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
1f770 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1f780 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
1f790 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f7a0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
1f7b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1f7c0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
1f7d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f7e0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
1f7f0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
1f800 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1f810 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
1f820 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
1f830 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
1f840 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
1f850 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
1f860 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
1f870 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1f880 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
1f890 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
1f8a0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1f8b0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
1f8c0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
1f8d0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
1f8e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1f8f0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
1f900 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
1f910 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f920 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
1f930 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1f940 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
1f950 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
1f960 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1f970 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
1f980 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1f990 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
1f9a0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1f9b0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
1f9c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1f9d0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1f9e0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1f9f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fa00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fa10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1fa20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fa30 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1fa40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fa50 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
1fa60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1fa70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1fa80 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1fa90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
1faa0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1fab0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1fac0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1fad0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fae0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
1faf0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1fb00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1fb10 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
1fb20 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
1fb30 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1fb40 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
1fb50 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
1fb60 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
1fb70 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1fb80 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
1fb90 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
1fba0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1fbb0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
1fbc0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
1fbd0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
1fbe0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
1fbf0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
1fc00 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
1fc10 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1fc20 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
1fc30 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1fc40 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1fc50 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
1fc60 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
1fc70 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
1fc80 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
1fc90 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
1fca0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
1fcb0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
1fcc0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1fcd0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
1fce0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1fcf0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1fd00 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1fd10 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1fd20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1fd30 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fd40 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fd50 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1fd60 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1fd70 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
1fd80 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
1fd90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fda0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
1fdb0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
1fdc0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
1fdd0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
1fde0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
1fdf0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
1fe00 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
1fe10 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1fe20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
1fe30 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
1fe40 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
1fe50 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
1fe60 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
1fe70 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
1fe80 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
1fe90 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
1fea0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
1feb0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
1fec0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
1fed0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1fee0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
1fef0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1ff00 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
1ff10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ff20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1ff30 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1ff40 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
1ff50 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
1ff60 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
1ff70 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
1ff80 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1ff90 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
1ffa0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
1ffb0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
1ffc0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
1ffd0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
1ffe0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
1fff0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
20000 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
20010 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
20020 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
20030 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
20040 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
20050 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
20060 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
20070 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
20080 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
20090 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
200a0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
200b0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
200c0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
200d0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
200e0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
200f0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
20100 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
20110 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
20120 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
20130 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
20140 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
20150 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
20160 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
20170 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
20180 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
20190 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
201a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
201b0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
201c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
201d0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
201e0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
201f0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
20200 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
20210 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
20220 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
20230 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
20240 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
20250 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
20260 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
20270 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
20280 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
20290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
202a0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
202b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
202c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
202d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
202e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
202f0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
20300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20310 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
20320 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
20330 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
20340 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
20350 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
20360 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
20370 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
20380 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
20390 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
203a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
203b0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
203c0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
203d0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
203e0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
203f0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
20400 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
20410 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
20420 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
20430 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
20440 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
20450 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
20460 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
20470 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
20480 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
20490 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
204a0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
204b0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
204c0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
204d0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
204e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
204f0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
20500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
20510 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
20520 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
20530 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
20540 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
20550 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
20560 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
20580 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
20590 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
205a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
205b0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
205c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
205d0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
205e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
205f0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
20600 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
20610 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
20620 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20630 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
20640 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
20650 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
20660 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
20670 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
20680 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
20690 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
206a0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
206b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
206c0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
206d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
206e0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
206f0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
20700 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
20710 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
20720 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
20730 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
20740 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
20750 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
20760 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
20770 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
20780 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
20790 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
207a0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
207b0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
207c0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
207d0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
207e0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
207f0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
20800 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
20810 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
20820 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
20830 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
20840 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
20850 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
20860 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
20870 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
20880 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
20890 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
208a0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
208b0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
208c0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
208d0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
208e0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
208f0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
20900 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
20910 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20920 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
20930 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
20940 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
20950 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
20960 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
20970 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
20980 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
20990 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
209a0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
209b0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
209c0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
209d0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
209e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
209f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
20a00 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
20a10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20a20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
20a30 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
20a40 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
20a50 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
20a60 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
20a70 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
20a80 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
20a90 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
20aa0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
20ab0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
20ac0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
20ad0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
20ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20af0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
20b00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20b30 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
20b40 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
20b50 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
20b60 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
20b70 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
20b80 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
20b90 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
20ba0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
20bb0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
20bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20bd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
20be0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
20bf0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
20c00 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
20c10 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
20c20 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
20c30 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
20c40 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
20c50 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
20c60 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
20c70 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
20c80 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
20c90 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
20ca0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
20cb0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
20cc0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
20cd0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
20ce0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
20cf0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
20d00 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
20d10 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
20d20 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
20d30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
20d40 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
20d50 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
20d60 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
20d70 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
20d80 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
20d90 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
20da0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
20db0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
20dc0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
20dd0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
20de0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
20df0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
20e00 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
20e10 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
20e20 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
20e30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
20e40 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
20e50 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
20e60 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
20e70 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
20e80 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
20e90 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
20ea0 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
20eb0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
20ec0 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 6c 75 61  azily .** poplua
20ed0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
20ee0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
20ef0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
20f00 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
20f10 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
20f20 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
20f30 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
20f40 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
20f50 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
20f60 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
20f70 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
20f80 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20f90 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
20fa0 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
20fb0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
20fc0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
20fd0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
20fe0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
20ff0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
21000 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
21010 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
21020 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
21030 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
21040 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
21050 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
21060 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
21070 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
21080 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
21090 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
210a0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
210b0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
210c0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
210d0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
210e0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
210f0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
21100 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
21110 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
21120 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
21130 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
21140 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
21150 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
21160 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
21170 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
21180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
21190 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
211a0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
211b0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
211c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
211d0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
211e0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
211f0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
21200 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
21210 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
21220 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
21230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
21240 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
21250 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
21260 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
21270 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
21280 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21290 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
212a0 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
212b0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
212c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
212d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
212e0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
212f0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
21300 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
21310 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
21340 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
21350 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21360 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
21370 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62 45 6e  W_READ.  int bEn
21380 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
213b0 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f  reading to end o
213c0 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66  f data */.#endif
213d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
213e0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
213f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21400 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
21410 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
21420 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
21430 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
21440 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21450 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f   );.  assert( eO
21470 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d  p!=2 || offset==
21480 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 41 6c 77  0 );      /* Alw
21490 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
214a0 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
214b0 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
214c0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
214d0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
214e0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
214f0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
21500 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
21510 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
21520 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
21530 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Key);.#ifdef SQL
21540 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
21550 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
21560 3d 20 28 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 6e  = (offset+amt==n
21570 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
21580 44 61 74 61 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Data);.#endif.. 
21590 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65   if( NEVER(offse
215a0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
215b0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a  r->info.nData) .
215c0 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
215d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
215e0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
215f0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
21600 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
21610 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
21620 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
21630 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
21640 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
21650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21660 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21670 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
21680 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
21690 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
216a0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
216b0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
216c0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
216d0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
216e0 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
216f0 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
21700 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
21710 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
21720 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
21730 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
21740 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
21750 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
21760 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
21770 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
21780 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
21790 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
217a0 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
217b0 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
217c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
217d0 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
217e0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
217f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21800 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21810 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
21820 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
21830 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
21840 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
21850 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
21860 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
21870 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
21880 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
21890 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
218a0 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
218b0 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
218c0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
218d0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
218e0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
218f0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20   it now..    ** 
21900 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
21910 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f  llocate aOverflo
21920 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a  w[] for eOp==2..
21930 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21940 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21950 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
21960 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
21970 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
21980 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
21990 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
219a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
219b0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
219c0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
219d0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
219e0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
219f0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
21a00 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
21a10 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
21a20 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
21a30 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
21a40 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
21a50 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
21a60 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70  if( eOp!=2 && (p
21a70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
21a80 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
21a90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
21aa0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
21ab0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
21ac0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
21ad0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
21ae0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
21af0 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
21b00 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
21b10 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
21b20 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62 52 65  gno*)sqlite3DbRe
21b30 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
21b40 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d     pCur->pBtree-
21b50 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
21b60 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69  flow, nOvfl*2*si
21b70 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20  zeof(Pgno).     
21b80 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
21b90 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
21ba0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21bb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
21bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21bd0 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c     pCur->nOvflAl
21be0 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20  loc = nOvfl*2;. 
21bf0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
21c00 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
21c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21c20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
21c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21c40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
21c50 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
21c60 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
21c70 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43  no));.        pC
21c80 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21c90 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
21ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21cb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
21cc0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
21cd0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
21ce0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
21cf0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
21d00 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
21d10 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
21d20 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
21d30 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
21d40 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
21d50 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
21d60 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
21d70 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26 26 20  alidOvfl)!=0 && 
21d80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21d90 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
21da0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
21db0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
21dc0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
21dd0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
21de0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
21df0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
21e00 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
21e10 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
21e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e30 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
21e40 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
21e50 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
21e60 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
21e70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21e80 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
21e90 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
21ea0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
21eb0 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
21ec0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
21ed0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21ee0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
21ef0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
21f00 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
21f10 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
21f20 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
21f30 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
21f40 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
21f50 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
21f60 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
21f70 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
21f80 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
21f90 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
21fa0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
21fb0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
21fc0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
21fd0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
21fe0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
21ff0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
22000 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
22010 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
22020 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
22030 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
22040 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
22050 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
22060 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
22070 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
22080 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
22090 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
220a0 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
220b0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
220c0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
220d0 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
220e0 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
220f0 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
22100 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
22110 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
22120 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
22130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
22140 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
22150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22160 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22170 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
22180 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
22190 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
221a0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
221b0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
221c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
221d0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
221e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
221f0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
22200 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
22210 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
22220 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
22230 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
22240 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
22250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22260 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
22270 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
22280 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
22290 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
222a0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
222b0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
222c0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
222d0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
222e0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
222f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22300 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
22310 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
22320 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
22330 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
22340 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
22350 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
22360 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
22370 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
22380 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
22390 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
223a0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
223b0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
223c0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
223d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
223e0 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
223f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
22400 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
22410 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
22420 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
22430 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
22440 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
22450 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
22460 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
22470 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
22480 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
22490 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
224a0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
224b0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
224c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
224d0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
224e0 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
224f0 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
22500 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
22510 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
22520 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
22530 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
22540 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22550 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
22560 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
22570 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
22580 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
22590 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
225a0 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
225b0 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
225c0 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
225d0 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
225e0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
225f0 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
22600 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
22610 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
22620 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
22630 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
22640 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22670 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
22680 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
226c0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
226d0 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
226e0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22700 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
22710 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
22720 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
22730 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
22740 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
22750 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
22760 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
22770 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
22780 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
22790 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
227a0 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
227b0 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
227c0 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
227d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
227e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
227f0 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
22800 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
22810 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
22820 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
22830 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
22840 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
22850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22860 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
22870 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
22880 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
22890 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
228a0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
228b0 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
228c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
228d0 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
228e0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
228f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
22900 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
22910 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
22920 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22930 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
22940 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
22950 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
22960 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
22970 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d      ((eOp&0x01)=
22980 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
22990 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
229a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
229b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
229c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
229d0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
229e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
229f0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
22a00 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
22a10 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
22a20 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
22a30 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
22a40 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
22a50 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
22a60 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20   a, (eOp&0x01), 
22a70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
22a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
22a90 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
22aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
22ab0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
22ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22ad0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
22ae0 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
22af0 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
22b00 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
22b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
22b20 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
22b30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22b40 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
22b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22b60 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
22b70 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
22b80 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
22b90 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
22ba0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
22bb0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
22bc0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
22bd0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
22be0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
22bf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
22c00 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
22c10 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
22c20 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
22c30 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
22c40 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
22c50 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22c60 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22c70 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22c80 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22c90 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22ca0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22cb0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
22cc0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
22cd0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
22ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
22cf0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
22d00 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22d10 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22d20 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
22d30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22d40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22d50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22d60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22d70 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22d80 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22d90 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22da0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
22db0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22dc0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22dd0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
22de0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22df0 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
22e00 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
22e10 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
22e20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
22e30 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
22e40 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
22e50 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
22e60 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
22e70 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
22e80 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
22e90 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
22ea0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
22eb0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
22ec0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
22ed0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
22ee0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22ef0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
22f00 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
22f10 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
22f20 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
22f30 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
22f40 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
22f50 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
22f60 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
22f70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22f80 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
22f90 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22fa0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22fb0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
22fc0 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
22fd0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
22fe0 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
22ff0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
23000 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
23010 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
23020 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
23030 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23040 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23050 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
23060 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
23070 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
23080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23090 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
230a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
230b0 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
230c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
230d0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
230e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
230f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
23100 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23110 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23120 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23130 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
23140 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
23150 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
23160 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
23170 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23180 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23190 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
231a0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
231b0 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
231c0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
231d0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
231e0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
231f0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
23200 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
23210 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
23220 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
23230 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
23240 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
23250 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
23260 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
23270 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
23280 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
23290 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
232a0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
232b0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
232c0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
232d0 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
232e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
232f0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
23300 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23310 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
23320 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
23330 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
23340 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
23350 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
23360 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
23370 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
23380 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
23390 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
233a0 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
233b0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
233c0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
233d0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
233e0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
233f0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
23400 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
23410 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
23420 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
23430 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
23440 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
23450 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
23460 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
23470 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
23480 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
23490 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
234a0 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
234b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
234c0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
234d0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
234e0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
234f0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
23500 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
23510 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
23520 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
23530 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
23540 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
23550 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
23560 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23570 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23580 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23590 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
235a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
235b0 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
235c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
235d0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
235e0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
235f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
23600 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
23610 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
23620 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23630 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
23640 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23650 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23660 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
23670 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
23680 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
23690 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
236a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
236b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
236c0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
236d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
236e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
236f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
23700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23710 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
23720 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72  ;.  *pAmt = pCur
23730 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
23740 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 28   return (void*)(
23750 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
23760 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
23770 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  eader);.}.../*.*
23780 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
23790 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
237a0 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
237b0 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
237c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
237d0 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
237e0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
237f0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
23800 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
23810 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
23820 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
23830 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
23840 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
23850 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
23860 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
23870 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
23880 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
23890 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
238a0 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
238b0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
238c0 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
238d0 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
238e0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
238f0 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
23900 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
23910 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
23920 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
23930 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
23940 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
23950 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
23960 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
23970 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
23980 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
23990 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
239a0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
239b0 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
239c0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
239d0 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
239e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
239f0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
23a00 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
23a10 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
23a20 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
23a30 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
23a40 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
23a50 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
23a60 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
23a70 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
23a80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
23a90 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
23aa0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
23ab0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
23ac0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
23ad0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
23ae0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
23af0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
23b00 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
23b10 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
23b20 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
23b30 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
23b40 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
23b50 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
23b60 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
23b70 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
23b80 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
23b90 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
23ba0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
23bb0 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
23bc0 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
23bd0 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
23be0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
23bf0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
23c00 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
23c10 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
23c20 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
23c30 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
23c40 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
23c50 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
23c60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
23c70 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
23c80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23c90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23ca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23cb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23cc0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
23cd0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
23ce0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
23cf0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23d00 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
23d10 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
23d20 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
23d30 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
23d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23d50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23d60 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
23d70 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
23d80 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20  , &pNewPage,.   
23d90 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
23da0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
23db0 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
23dc0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
23dd0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66  DONLY : 0);.  if
23de0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23df0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
23e00 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
23e10 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
23e20 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
23e30 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
23e40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23e50 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
23e60 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
23e70 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
23e80 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
23e90 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
23ea0 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
23eb0 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
23ec0 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
23ed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23ee0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23ef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
23f00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
23f10 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50   0./*.** Page pP
23f20 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
23f30 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
23f40 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
23f50 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
23f60 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
23f70 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
23f80 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
23f90 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
23fa0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
23fb0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
23fc0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
23fd0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
23fe0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
23ff0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
24000 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
24010 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
24020 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
24030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
24040 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
24050 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
24060 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
24070 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
24080 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
24090 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
240a0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
240b0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
240c0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
240d0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
240e0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
240f0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
24100 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
24110 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
24120 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
24130 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
24140 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
24150 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
24160 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
24170 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
24180 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
24190 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
241a0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
241b0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
241c0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
241d0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
241e0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
241f0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
24200 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
24210 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
24220 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
24230 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
24240 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
24250 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
24260 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
24270 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
24280 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
24290 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
242a0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
242b0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
242c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
242d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
242e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
242f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24300 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24310 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
24320 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
24330 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
24340 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a  );..  /* UPDATE:
24350 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   It is actually 
24360 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
24370 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65   condition teste
24380 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a  d by the assert.
24390 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65    ** below to be
243a0 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64   untrue if the d
243b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
243c0 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61  corrupt. This ca
243d0 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20  n occur if.  ** 
243e0 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  one cursor has m
243f0 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61  odified page pPa
24400 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66  rent while a ref
24410 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20  erence to it is 
24420 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20  held .  ** by a 
24430 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57  second cursor. W
24440 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
24450 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65  ppen if a single
24460 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a   page is linked.
24470 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74    ** into more t
24480 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
24490 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f  tructure in a co
244a0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
244b0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
244c0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
244d0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
244e0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
244f0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
24500 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
24510 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
24520 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24530 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69  >pgno.  );.#endi
24540 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  f.  testcase( pC
24550 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24560 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
24570 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24580 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
24590 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
245a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
245b0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
245c0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
245d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
245e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
245f0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
24600 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
24610 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a  alidOvfl);.}../*
24620 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
24630 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
24640 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
24650 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
24660 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
24670 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
24680 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
24690 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
246a0 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
246b0 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
246c0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
246d0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
246e0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
246f0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
24700 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
24710 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
24720 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
24730 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
24740 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
24750 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
24760 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
24770 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
24780 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
24790 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
247a0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
247b0 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
247c0 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
247d0 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
247e0 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
247f0 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
24800 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
24810 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
24820 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
24830 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
24840 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
24850 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
24860 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
24870 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
24880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
24890 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
248a0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
248b0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
248c0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
248d0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
248e0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
248f0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
24900 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
24910 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
24920 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
24930 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
24940 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
24950 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
24960 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
24970 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
24980 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
24990 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
249a0 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
249b0 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
249c0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
249d0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
249e0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
249f0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
24a00 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
24a10 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
24a20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
24a30 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
24a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
24a50 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
24a60 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
24a70 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
24a80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24a90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24aa0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24ab0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24ac0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
24ad0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
24ae0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
24af0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
24b00 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24b10 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24b20 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
24b30 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
24b40 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
24b50 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
24b60 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
24b70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
24b80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24b90 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
24ba0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
24bb0 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
24bc0 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
24bd0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
24be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24bf0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
24c00 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
24c10 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
24c20 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  e>=0 ){.    whil
24c30 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  e( pCur->iPage )
24c40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24c50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24c60 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c  iPage--]);.  }el
24c70 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
24c80 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
24c90 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24ca0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24cb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24cc0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
24cd0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
24ce0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
24cf0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
24d00 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
24d10 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
24d20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
24d30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
24d40 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
24d50 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
24d60 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
24d70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24d80 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
24d90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24da0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24db0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24dc0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
24dd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f   = 0;.  }.  pRoo
24de0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
24df0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
24e00 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
24e10 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
24e20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
24e30 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
24e40 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
24e50 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
24e60 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
24e70 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
24e80 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
24e90 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
24ea0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
24eb0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
24ec0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
24ed0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
24ee0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24ef0 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
24f00 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24f10 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
24f20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
24f30 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
24f40 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
24f50 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
24f60 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
24f70 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
24f80 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
24f90 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
24fa0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
24fb0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
24fc0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
24fd0 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
24fe0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
24ff0 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
25000 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
25010 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
25020 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
25030 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
25040 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
25050 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
25060 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25070 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
25080 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
25090 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
250a0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
250b0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
250c0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
250d0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
250e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
250f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
25100 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
25110 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
25120 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
25130 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
25140 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
25150 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
25160 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
25170 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
25180 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
25190 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
251a0 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
251b0 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
251c0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
251d0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
251e0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
251f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25200 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
25210 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
25220 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
25230 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
25240 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
25250 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
25260 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
25270 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
25280 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
25290 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
252a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
252b0 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
252c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
252d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
252e0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
252f0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
25300 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
25310 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
25320 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
25330 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
25340 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
25350 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
25360 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
25370 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
25380 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
25390 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
253a0 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
253b0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
253c0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
253d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
253e0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
253f0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
25400 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25410 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25420 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25430 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25440 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
25450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25460 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
25470 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25480 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
25490 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
254a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
254b0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
254c0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
254d0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
254e0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
254f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25500 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
25510 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
25520 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
25530 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25540 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
25550 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
25560 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
25570 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
25580 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
25590 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
255a0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
255b0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
255c0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
255d0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
255e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
255f0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
25600 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
25610 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
25620 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
25630 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
25640 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
25650 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
25660 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
25670 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
25680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
25690 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
256a0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
256b0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
256c0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
256d0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
256e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
256f0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
25700 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25710 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
25720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25730 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
25740 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
25750 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25760 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25770 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25780 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25790 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
257a0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
257b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
257c0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
257d0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
257e0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
257f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25800 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
25810 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25820 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
25830 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
25840 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
25850 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
25860 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25870 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
25880 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
25890 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
258a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
258b0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
258c0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
258d0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
258e0 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
258f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25900 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
25910 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
25920 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
25930 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
25940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
25950 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
25960 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
25970 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
25980 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
25990 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
259a0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
259b0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
259c0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
259d0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
259e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
259f0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
25a00 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
25a10 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25a20 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25a30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
25a40 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
25a50 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
25a60 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
25a70 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
25a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25a90 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
25aa0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
25ab0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
25ac0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25ad0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25ae0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25af0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
25b00 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25b10 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
25b20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
25b30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25b40 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
25b50 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25b60 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25b70 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
25b80 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
25b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25ba0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25bb0 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
25bc0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
25bd0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
25be0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
25bf0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
25c00 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
25c10 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
25c20 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
25c30 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
25c40 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
25c50 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
25c60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
25c70 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
25c80 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
25c90 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
25ca0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25cb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25cc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25cd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
25ce0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
25cf0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
25d00 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
25d10 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
25d20 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
25d30 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
25d40 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
25d50 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25d60 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
25d70 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
25d80 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
25d90 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
25da0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
25db0 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
25dc0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
25dd0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
25de0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
25df0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
25e00 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
25e10 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
25e20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25e30 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
25e40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25e50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
25e60 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
25e70 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
25e80 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
25e90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25ea0 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
25eb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25ec0 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
25ed0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25ee0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25ef0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
25f00 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
25f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
25f20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
25f30 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
25f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25f50 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
25f60 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
25f70 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
25f80 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
25f90 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
25fa0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25fb0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
25fc0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25fd0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
25fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25ff0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26000 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
26010 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26020 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
26030 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
26040 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26060 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
26070 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
26080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26090 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
260a0 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
260b0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
260c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
260d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
260e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
260f0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
26100 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
26110 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
26120 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
26130 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
26140 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
26150 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
26160 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
26170 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
26180 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
26190 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
261a0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
261b0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
261c0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
261d0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
261e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
261f0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
26200 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
26210 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
26220 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
26230 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
26240 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
26250 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
26260 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
26270 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
26280 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
26290 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
262a0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
262b0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
262c0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
262d0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
262e0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
262f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
26300 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
26310 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
26320 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
26330 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
26340 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
26350 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
26360 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
26370 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
26380 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
26390 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
263a0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
263b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
263c0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
263f0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
26400 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
26410 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
26430 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
26440 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
26450 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
26460 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
26470 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
26480 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
26490 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
264a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
264b0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
264c0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
264d0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
264e0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
264f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
26500 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
26510 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
26540 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
26550 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
26560 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
26570 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
26580 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
26590 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
265a0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
265b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
265c0 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
265d0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
265e0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
265f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26600 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
26610 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
26630 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
26640 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
26650 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
26660 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
26670 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
26680 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
26690 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
266a0 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
266b0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
266c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
266d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
266e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
266f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26700 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
26710 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
26720 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
26730 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
26740 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
26750 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
26760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
26770 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
26780 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
26790 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
267a0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
267b0 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
267c0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
267d0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
267e0 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
267f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
26800 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
26810 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
26820 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
26830 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
26840 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
26850 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
26860 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
26870 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
26880 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
26890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
268a0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
268b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
268c0 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43  AtLast)!=0 && pC
268d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
268e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
268f0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
26900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
26920 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
26930 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
26940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
26950 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
26960 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
26970 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
26980 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
26990 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
269a0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
269b0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
269c0 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
269d0 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
269e0 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
269f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
26a00 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
26a10 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
26a20 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
26a30 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
26a40 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
26a50 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
26a60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
26a70 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
26a80 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
26a90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26aa0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
26ab0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
26ac0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
26ad0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26ae0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
26af0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
26b00 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
26b10 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
26b20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26b30 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
26b40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26b50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
26b60 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
26b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
26b80 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26b90 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26ba0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
26bb0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
26bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26bd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
26be0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
26bf0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
26c00 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
26c10 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
26c20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
26c30 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
26c40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
26c50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26c60 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
26c70 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
26ca0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
26cb0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
26cc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
26cd0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
26ce0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
26cf0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
26d00 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
26d10 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
26d20 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
26d30 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
26d40 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
26d50 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
26d60 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
26d70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
26d80 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
26d90 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
26da0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
26db0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
26dc0 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
26dd0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
26de0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
26df0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
26e00 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
26e10 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
26e20 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
26e30 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
26e40 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
26e50 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
26e60 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
26e70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26e80 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
26e90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26ea0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
26eb0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
26ec0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
26ed0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
26ee0 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
26ef0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
26f00 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
26f10 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
26f20 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
26f30 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
26f40 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
26f50 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61  ; */.    pCur->a
26f60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26f70 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
26f80 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
26f90 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
26fa0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
26fb0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
26fc0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
26fd0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26fe0 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
26ff0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
27000 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
27010 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
27020 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
27030 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
27040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27050 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
27060 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
27070 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27080 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
27090 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
270a0 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
270b0 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
270c0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
270d0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
270e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
270f0 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
27100 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
27110 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
27120 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
27130 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
27140 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
27150 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
27160 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
27170 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
27180 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
27190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
271a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
271b0 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
271c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
271d0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
271e0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
271f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
27200 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
27210 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
27220 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27230 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27240 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
27250 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
27260 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
27270 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
27280 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27290 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
272a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
272b0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
272c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
272d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
272e0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
272f0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
27300 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
27320 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
27330 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
27340 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
27350 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
27360 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
27370 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27380 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
27390 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
273a0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
273b0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
273c0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
273d0 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20  ldPtrSize;..    
273e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
273f0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
27400 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
27410 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
27420 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
27430 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
27440 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
27450 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
27460 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
27470 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
27480 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
27490 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
274a0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
274b0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
274c0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
274d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
274e0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
274f0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
27500 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
27510 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
27520 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
27530 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
27540 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
27550 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
27560 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
27570 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
27580 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
27590 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
275a0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
275b0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
275c0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
275d0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
275e0 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
275f0 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
27600 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
27610 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
27620 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
27630 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
27640 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
27650 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
27660 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
27670 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
27680 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
27690 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
276a0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
276b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
276c0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
276d0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
276e0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
276f0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
27700 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
27710 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
27720 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20   pIdxKey, 0);.  
27730 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27740 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
27750 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
27760 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
27770 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
27780 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
27790 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
277a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
277b0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
277c0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
277d0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
277e0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
277f0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
27800 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
27810 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
27820 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
27830 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
27840 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
27850 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
27860 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
27870 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
27880 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
27890 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  dxKey, 0);.     
278a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
278b0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
278c0 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
278d0 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
278e0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
278f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
27900 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
27910 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
27920 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
27930 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
27940 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
27950 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
27960 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
27970 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
27980 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
27990 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
279a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
279b0 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
279c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76  . */.          v
279d0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
279e0 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
279f0 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
27a00 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
27a10 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
27a20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
27a30 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
27a40 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
27a50 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
27a60 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
27a70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
27a80 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
27a90 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
27aa0 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20  loc( nCell );.  
27ab0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
27ac0 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
27ad0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27ae0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
27af0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27b00 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
27b10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27b20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27b30 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
27b40 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
27b50 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
27b60 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
27b70 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
27b80 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a  *)pCellKey, 2);.
27b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27bb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
27bc0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
27bd0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27be0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
27bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
27c00 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
27c10 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
27c20 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20  , pIdxKey, 0);. 
27c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27c40 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
27c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27c60 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
27c70 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
27c80 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
27c90 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
27ca0 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
27cb0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
27cc0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
27cd0 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
27ce0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27cf0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
27d00 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
27d10 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
27d20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
27d30 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
27d40 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
27d50 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
27d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27d70 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
27d80 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
27d90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
27da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27db0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
27dc0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27dd0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
27de0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
27df0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
27e00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
27e10 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
27e20 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
27e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27e40 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
27e50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27e60 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
27e70 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
27e80 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
27e90 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
27ea0 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
27eb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
27ec0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
27ed0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
27ee0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
27ef0 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
27f00 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
27f10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
27f20 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
27f30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27f40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27f50 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
27f60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
27f70 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
27f80 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27f90 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
27fa0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
27fb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
27fc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
27fd0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
27fe0 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
27ff0 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
28000 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
28010 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
28020 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
28030 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
28040 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28050 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
28060 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
28070 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
28080 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
28090 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
280a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
280b0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
280c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
280d0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
280e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
280f0 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
28100 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
28110 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28120 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28130 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
28140 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
28150 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  vfl);.  return r
28160 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
28170 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
28180 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
28190 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
281a0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
281b0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
281c0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
281d0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
281e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
281f0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
28200 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
28210 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
28220 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
28230 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
28240 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
28250 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
28260 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
28270 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
28280 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28290 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
282a0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
282b0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
282c0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
282d0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
282e0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
282f0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
28300 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
28310 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
28320 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
28330 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
28340 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
28350 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
28360 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
28370 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
28380 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
28390 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
283a0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
283b0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
283c0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
283d0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
283e0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
283f0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
28400 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
28410 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
28420 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
28430 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28440 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
28450 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
28460 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
28470 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
28480 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
28490 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
284a0 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
284b0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
284c0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
284d0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
284e0 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
284f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
28500 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
28510 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
28520 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
28530 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
28540 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
28550 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
28560 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
28570 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
28580 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
28590 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
285a0 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
285b0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
285c0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
285d0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
285e0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
285f0 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
28600 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
28610 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
28620 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
28630 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
28640 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
28650 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
28660 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
28670 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
28680 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
28690 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
286a0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
286b0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
286c0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
286d0 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
286e0 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
286f0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
28700 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
28710 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
28720 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
28730 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
28740 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
28750 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
28760 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
28770 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
28780 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28790 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
287a0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
287b0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
287c0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
287d0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
287e0 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
287f0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
28800 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
28810 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
28820 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
28830 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
28840 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28850 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28860 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28870 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28880 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
28890 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
288a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
288b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
288c0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res==0 );.  if( 
288d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
288e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
288f0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
28900 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28910 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
28920 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
28930 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
28940 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
28950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28980 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
28990 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
289a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
289b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
289c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
289d0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
289e0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
289f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28a00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28a10 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
28a20 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
28a30 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
28a40 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
28a50 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
28a60 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
28a70 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
28a80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
28a90 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28ab0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
28ac0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
28ad0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
28ae0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
28af0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
28b00 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
28b10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28b20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
28b30 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
28b40 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
28b50 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
28b60 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
28b70 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
28b80 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
28b90 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
28ba0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
28bb0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
28bc0 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
28bd0 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
28be0 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
28bf0 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
28c00 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
28c10 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
28c20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
28c30 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
28c40 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
28c50 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
28c60 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
28c70 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
28c80 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
28c90 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
28ca0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
28cb0 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
28cc0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
28cd0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
28ce0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28cf0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
28d00 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
28d10 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
28d20 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
28d30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
28d40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
28d50 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
28d60 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
28d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
28d80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
28d90 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
28da0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
28db0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
28dc0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
28dd0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
28de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
28e00 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
28e10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
28e20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28e30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
28e40 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
28e50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
28e60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
28e70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
28e80 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
28e90 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74  return sqlite3Bt
28ea0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
28eb0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
28ec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28ed0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
28ee0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
28ef0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
28f00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28f10 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
28f20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
28f30 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
28f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
28f50 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28f60 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
28f70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
28f80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
28f90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
28fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
28fb0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
28fc0 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
28fd0 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
28fe0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
28ff0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
29000 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
29010 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
29020 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29030 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29040 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
29050 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
29060 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  vfl);.  *pRes = 
29070 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
29080 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
29090 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
290a0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
290b0 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  s);.  pPage = pC
290c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
290d0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
290e0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
290f0 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61  ur->iPage])>=pPa
29100 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
29110 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29120 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
29130 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
29140 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
29150 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
29160 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
29170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29180 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
29190 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
291a0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
291b0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
291c0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
291d0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
291e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
291f0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
29200 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
29210 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
29220 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
29230 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
29240 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
29250 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
29260 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
29270 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
29280 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
29290 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
292a0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
292b0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
292c0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
292d0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
292e0 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
292f0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
29300 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
29310 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
29320 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
29330 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
29340 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
29350 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
29360 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
29370 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
29380 75 73 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  us() helper.** r
29390 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
293a0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
293b0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
293c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
293d0 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
293e0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
293f0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
29400 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
29410 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
29420 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
29430 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
29440 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
29450 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
29460 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
29470 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
29480 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
29490 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
294a0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
294b0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
294c0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
294d0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
294e0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
294f0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
29500 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
29510 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
29520 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
29530 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
29540 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
29550 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
29560 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
29570 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
29580 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
29590 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
295a0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
295b0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
295c0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
295d0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
295e0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
295f0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
29600 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
29610 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
29620 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
29630 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
29640 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
29650 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
29660 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
29670 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
29680 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
29690 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
296a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
296b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
296c0 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73  *pRes==0 );.  as
296d0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
296e0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
296f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29700 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29710 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
29720 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73  gs & (BTCF_AtLas
29730 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
29740 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
29750 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
29760 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
29770 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze==0 );.  if( p
29780 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
29790 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
297a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
297b0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
297c0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 20  QUIRESEEK );.   
297d0 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
297e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
297f0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
29800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29830 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
29840 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
29850 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
29860 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
29870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
29880 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
29890 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
298a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
298b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
298c0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
298d0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
298e0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
298f0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29900 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
29910 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
29920 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
29930 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
29940 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
29950 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
29960 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
29970 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
29980 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
29990 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
299a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
299b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
299c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
299d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
299e0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
299f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29a00 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
29a10 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
29a20 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
29a30 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
29a40 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
29a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29a60 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
29a70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
29a80 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
29a90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29aa0 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
29ab0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
29ac0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
29ad0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29ae0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29af0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
29b00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
29b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
29b30 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
29b40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
29b50 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
29b60 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
29b70 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
29b80 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
29b90 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
29ba0 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
29bb0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29bc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
29bd0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
29be0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29bf0 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
29c00 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
29c10 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
29c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29c30 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
29c40 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
29c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
29c60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29c70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29c80 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
29c90 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
29ca0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29cb0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73  int *pRes){.  as
29cc0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29cd0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
29ce0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
29cf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
29d00 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
29d10 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
29d20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
29d30 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
29d40 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
29d50 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
29d60 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
29d70 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
29d80 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
29d90 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
29da0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
29db0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
29dc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
29dd0 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
29de0 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  | pCur->aiIdx[pC
29df0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20  ur->iPage]==0.  
29e00 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
29e10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
29e20 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
29e30 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
29e40 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
29e50 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69  ;.  }.  pCur->ai
29e60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29e70 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
29e80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29e90 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
29ea0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
29eb0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
29ec0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
29ed0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
29ee0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
29ef0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
29f00 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
29f10 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
29f20 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
29f30 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
29f40 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
29f50 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
29f60 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
29f70 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
29f80 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
29f90 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
29fa0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
29fb0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
29fc0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
29fd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
29fe0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
29ff0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
2a000 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
2a010 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
2a020 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
2a030 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
2a040 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
2a050 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
2a060 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
2a070 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a080 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
2a090 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
2a0a0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
2a0b0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
2a0c0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
2a0d0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
2a0e0 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
2a0f0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
2a100 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
2a110 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
2a120 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
2a130 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
2a140 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
2a150 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
2a160 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
2a170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a180 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
2a190 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
2a1a0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
2a1b0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
2a1c0 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
2a1d0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
2a1e0 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
2a1f0 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
2a200 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
2a210 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2a220 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
2a230 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
2a240 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
2a250 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
2a260 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
2a270 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
2a280 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
2a290 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
2a2a0 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
2a2b0 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
2a2c0 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
2a2d0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
2a2e0 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
2a2f0 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
2a300 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2a310 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
2a320 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
2a330 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
2a340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
2a350 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2a360 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
2a370 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
2a380 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
2a390 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
2a3a0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
2a3b0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
2a3c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2a3d0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
2a3e0 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
2a3f0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
2a400 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
2a410 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
2a420 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2a430 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
2a440 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
2a450 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
2a460 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2a470 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
2a480 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
2a490 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2a4a0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
2a4b0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
2a4c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
2a4d0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
2a4e0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2a4f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2a500 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
2a510 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
2a520 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
2a530 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
2a540 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
2a550 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
2a560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a570 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2a580 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2a590 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
2a5a0 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
2a5b0 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
2a5c0 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
2a5d0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
2a5e0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2a5f0 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
2a600 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2a610 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
2a620 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2a630 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2a640 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2a650 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2a660 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a670 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a680 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2a690 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2a6a0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2a6b0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2a6c0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2a6d0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2a6e0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2a6f0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2a700 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2a710 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2a720 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2a730 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
2a740 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
2a750 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2a760 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
2a770 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
2a780 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
2a790 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2a7a0 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
2a7b0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2a7c0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
2a7d0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
2a7e0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2a7f0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
2a800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a810 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a820 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2a830 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
2a840 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
2a850 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
2a860 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
2a870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
2a880 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
2a890 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
2a8a0 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
2a8b0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2a8c0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
2a8d0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
2a8e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2a8f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2a900 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
2a910 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
2a920 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2a930 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
2a940 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2a950 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
2a960 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2a970 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2a980 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
2a990 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
2a9a0 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
2a9b0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
2a9c0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
2a9d0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
2a9e0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
2a9f0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
2aa00 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
2aa10 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
2aa20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2aa30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2aa40 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2aa50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2aa60 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
2aa70 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2aa80 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
2aa90 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
2aaa0 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
2aab0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
2aac0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
2aad0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
2aae0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
2aaf0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
2ab00 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
2ab10 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
2ab20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
2ab30 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
2ab40 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
2ab50 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2ab60 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
2ab70 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
2ab80 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
2ab90 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2aba0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2abb0 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
2abc0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
2abd0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
2abe0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
2abf0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2ac00 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2ac10 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2ac20 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2ac30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ac40 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2ac50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2ac60 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
2ac70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2ac80 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
2ac90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
2aca0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
2acb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2acc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2acd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ace0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2acf0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2ad00 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2ad10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ad20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2ad30 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2ad40 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2ad50 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2ad60 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2ad70 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2ad80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2ad90 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2ada0 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  ;..      k = get
2adb0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2adc0 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
2add0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
2ade0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2adf0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2ae00 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2ae10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ae20 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2ae30 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2ae40 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2ae50 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2ae60 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2ae70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2ae80 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2ae90 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2aea0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2aeb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2aec0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2aed0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2aee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2aef0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2af00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2af10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2af20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2af30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2af40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af50 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2af60 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2af70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2af80 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2af90 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2afa0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2afb0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2afc0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2afd0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2afe0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2aff0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2b000 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2b010 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2b020 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2b030 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2b040 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2b050 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2b060 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2b070 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2b080 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2b090 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2b0a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b0b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2b0c0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2b0d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2b0e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2b0f0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2b100 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2b110 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2b120 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2b130 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2b140 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2b150 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2b160 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2b170 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2b180 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2b190 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2b1a0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2b1b0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2b1c0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2b1d0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2b1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2b1f0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2b200 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2b210 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2b220 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2b230 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b240 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2b250 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2b260 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b270 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2b280 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2b290 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2b2a0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2b2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2b2c0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2b2d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2b2e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2b2f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2b300 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2b310 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2b330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b340 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2b350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b380 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b390 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b3a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b3b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2b3c0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2b3d0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2b3e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2b3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b410 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2b420 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2b430 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2b440 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2b450 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2b460 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2b470 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2b480 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2b490 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2b4a0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2b4b0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2b4c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2b4d0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2b4e0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2b4f0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2b500 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2b510 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2b520 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2b530 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2b540 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2b550 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b560 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2b570 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2b580 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2b590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2b5a0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2b5b0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2b5c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2b5d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2b5e0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2b5f0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2b600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b620 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2b630 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2b640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b660 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2b670 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2b680 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b6a0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2b6b0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2b6c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2b6d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2b6e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2b6f0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2b700 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2b710 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2b720 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2b730 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2b740 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2b750 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2b760 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2b770 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2b780 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2b790 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2b7a0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2b7b0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2b7c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2b7d0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2b7e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2b7f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2b800 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2b810 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2b820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2b830 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2b840 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2b850 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2b860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b880 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2b890 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2b8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b8b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2b8c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b8d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b8e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b8f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2b900 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2b910 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2b920 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2b930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b940 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2b950 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2b960 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2b970 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2b980 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2b990 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2b9a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b9b0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2b9c0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2b9d0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2b9e0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2b9f0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2ba00 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2ba10 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2ba20 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2ba30 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2ba40 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2ba50 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2ba60 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2ba70 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2ba80 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2ba90 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2baa0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2bab0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2bac0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2bad0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2bae0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2baf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2bb00 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2bb20 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2bb30 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2bb40 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2bb50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2bb60 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2bb70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2bb80 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2bb90 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2bba0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2bbb0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2bbc0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2bbd0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2bbe0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2bbf0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2bc00 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2bc10 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2bc20 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2bc30 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2bc40 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2bc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc60 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2bc80 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2bc90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bcb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2bcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2bcd0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2bce0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2bcf0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2bd00 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2bd10 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2bd20 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2bd30 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2bd40 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2bd50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2bd60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bd70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2bd80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2bd90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2bda0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2bdb0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2bdc0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2bdd0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2bde0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2bdf0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2be00 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2be10 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2be20 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2be30 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2be40 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2be50 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2be60 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2be70 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2be80 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2be90 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2beb0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2bec0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2bed0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2bee0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2bef0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2bf00 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2bf10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2bf20 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2bf30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2bf40 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2bf50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2bf60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2bf70 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2bf90 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2bfa0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2bfb0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2bfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bfd0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2bfe0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2bff0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2c000 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2c010 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2c020 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ) ? PAGER_GET_NO
2c030 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
2c040 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2c050 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2c060 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
2c070 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2c080 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c0a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c0b0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2c0c0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2c0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2c100 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2c110 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2c120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2c130 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2c140 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2c150 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c160 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2c170 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
2c180 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
2c190 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
2c1a0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
2c1b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
2c1c0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
2c1d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
2c1e0 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
2c1f0 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
2c200 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2c210 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2c220 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
2c230 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
2c240 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
2c250 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
2c260 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
2c270 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
2c280 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
2c290 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
2c2a0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
2c2b0 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
2c2c0 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
2c2d0 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
2c2e0 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
2c2f0 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
2c300 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2c310 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2c320 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
2c330 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
2c340 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
2c350 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
2c360 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
2c370 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
2c380 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
2c390 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
2c3a0 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
2c3b0 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
2c3c0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
2c3d0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
2c3e0 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
2c3f0 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
2c400 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
2c410 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
2c420 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2c430 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
2c440 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
2c450 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
2c460 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2c470 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
2c480 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
2c490 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
2c4a0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
2c4b0 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
2c4c0 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
2c4d0 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
2c4e0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2c4f0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
2c500 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
2c510 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
2c520 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
2c530 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
2c540 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
2c550 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
2c560 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
2c570 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
2c580 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
2c590 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
2c5a0 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
2c5b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2c5c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2c5d0 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
2c5e0 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
2c5f0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 20  ->bDoTruncate)) 
2c600 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2c610 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20 20  NTENT : 0;..    
2c620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c630 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
2c640 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2c650 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2c660 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
2c670 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
2c680 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2c690 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2c6a0 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
2c6b0 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
2c6c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c6d0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2c6e0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
2c6f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2c700 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
2c710 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
2c720 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
2c730 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2c740 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
2c750 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
2c760 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2c770 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
2c780 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
2c790 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
2c7a0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
2c7b0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
2c7c0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
2c7d0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
2c7e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2c7f0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
2c800 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
2c810 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2c820 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2c830 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
2c840 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
2c850 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
2c860 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2c870 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
2c880 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2c890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
2c8a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2c8b0 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2c8c0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2c8d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c8f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c900 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2c910 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2c920 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2c930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c940 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2c950 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2c960 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2c970 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2c980 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2c990 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2c9a0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2c9b0 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2c9c0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2c9d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2c9e0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2c9f0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2ca00 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2ca10 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2ca20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ca30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2ca40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2ca50 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
2ca60 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2ca70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ca80 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
2ca90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2caa0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2cab0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2cac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cad0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2cae0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
2caf0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2cb00 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2cb10 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2cb20 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2cb30 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2cb40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2cb50 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
2cb60 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
2cb70 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2cb80 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2cb90 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2cba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cbb0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
2cbc0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2cbd0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2cbe0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
2cbf0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cc00 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2cc10 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2cc20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cc30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2cc40 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
2cc50 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
2cc60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2cc70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
2cc80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2cc90 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
2cca0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ccb0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
2ccc0 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
2ccd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2cce0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ccf0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
2cd00 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
2cd10 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
2cd20 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
2cd30 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2cd40 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2cd50 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
2cd60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
2cd70 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
2cd80 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2cd90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2cda0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2cdb0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
2cdc0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
2cdd0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
2cde0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
2cdf0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
2ce00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
2ce10 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
2ce20 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
2ce30 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
2ce40 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
2ce50 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
2ce60 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
2ce70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2ce80 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
2ce90 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2cea0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
2ceb0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
2cec0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
2ced0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
2cee0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2cef0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
2cf00 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
2cf10 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
2cf20 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
2cf30 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2cf40 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
2cf50 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
2cf60 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2cf70 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2cf80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2cf90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2cfa0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2cfb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2cfc0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2cfd0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2cfe0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2cff0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2d000 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2d010 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d030 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2d040 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2d050 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d080 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2d090 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2d0c0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2d0d0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2d0e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d0f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2d100 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2d110 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
2d120 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
2d130 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
2d140 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
2d150 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
2d160 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
2d170 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
2d180 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
2d190 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
2d1a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
2d1b0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2d1c0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2d1d0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
2d1e0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
2d1f0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
2d200 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2d210 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2d220 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2d230 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2d240 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
2d250 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
2d260 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2d270 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
2d280 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2d290 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
2d2a0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
2d2b0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2d2c0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
2d2d0 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
2d2e0 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
2d2f0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
2d300 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
2d310 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
2d320 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
2d330 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2d340 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
2d350 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
2d360 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2d370 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2d380 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
2d390 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
2d3a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d3b0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2d3c0 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
2d3d0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2d3e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2d3f0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
2d400 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
2d410 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
2d420 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2d430 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2d440 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2d450 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
2d460 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
2d470 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
2d480 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
2d490 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
2d4a0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2d4b0 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
2d4c0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
2d4d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
2d4e0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
2d4f0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2d500 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
2d510 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
2d520 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
2d530 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
2d540 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
2d550 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
2d560 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
2d570 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2d580 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
2d590 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
2d5a0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
2d5b0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2d5c0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
2d5d0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
2d5e0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
2d5f0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
2d600 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
2d610 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
2d620 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
2d630 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2d640 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
2d650 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
2d660 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2d670 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
2d680 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2d690 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
2d6a0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
2d6b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
2d6c0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
2d6d0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
2d6e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2d6f0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
2d700 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
2d710 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
2d720 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2d730 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2d740 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
2d750 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2d760 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2d770 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2d780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d790 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2d7a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2d7b0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2d7c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2d7d0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2d7e0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2d7f0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2d800 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2d810 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2d820 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2d830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d840 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2d850 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2d860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2d870 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2d880 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2d890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2d8a0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2d8b0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2d8c0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2d8d0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2d8e0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2d8f0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2d900 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2d910 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2d920 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2d930 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2d940 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2d950 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2d960 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2d970 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2d980 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2d990 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2d9a0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2d9b0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2d9c0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2d9d0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2d9e0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2d9f0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2da00 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2da10 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2da20 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2da30 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2da40 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2da50 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2da60 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2da70 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2da80 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2da90 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2daa0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2dab0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2dac0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2dad0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2dae0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2daf0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2db00 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2db10 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2db20 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2db30 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2db40 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2db50 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2db60 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2db70 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2db80 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2db90 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2dba0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2dbb0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2dbc0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2dbd0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2dbe0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2dbf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2dc00 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2dc10 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2dc20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dc30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dc40 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2dc50 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2dc60 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2dc70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2dc80 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2dc90 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2dca0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2dcb0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2dcc0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2dcd0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2dce0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2dcf0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2dd00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2dd10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2dd20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2dd30 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2dd40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2dd50 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2dd60 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2dd70 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2dd80 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2dd90 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2dda0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2ddb0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2ddc0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2ddd0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2dde0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2ddf0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2de00 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2de10 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2de20 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2de30 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2de40 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2de50 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2de60 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2de70 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2de80 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2de90 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2dea0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2deb0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2dec0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2ded0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2dee0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2def0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2df00 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2df10 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2df20 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2df30 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2df40 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2df50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2df60 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2df70 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
2df80 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2df90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2dfa0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2dfb0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2dfc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dfd0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2dfe0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
2dff0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
2e000 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
2e010 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2e020 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
2e030 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2e040 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
2e050 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
2e060 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
2e070 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
2e080 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
2e090 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
2e0a0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
2e0b0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
2e0c0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
2e0d0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2e0e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2e0f0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
2e100 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
2e110 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2e120 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
2e130 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2e140 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2e150 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2e160 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
2e170 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
2e180 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
2e190 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
2e1a0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
2e1b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2e1c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2e1d0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
2e1e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2e1f0 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
2e200 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
2e210 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
2e220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2e230 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
2e240 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2e250 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
2e260 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
2e270 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
2e280 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
2e290 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e2a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2e2b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2e2c0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2e2d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2e2e0 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
2e2f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
2e300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e310 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
2e320 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2e330 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
2e340 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
2e350 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
2e360 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
2e370 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
2e380 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
2e390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e3a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e3b0 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
2e3c0 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
2e3d0 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
2e3e0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
2e3f0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2e400 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
2e410 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2e420 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
2e430 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
2e440 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2e450 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
2e460 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
2e470 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
2e480 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
2e490 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
2e4a0 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
2e4b0 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
2e4c0 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
2e4d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
2e4e0 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
2e4f0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2e500 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
2e510 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
2e520 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2e530 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
2e540 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
2e550 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2e560 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
2e570 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
2e580 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
2e590 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
2e5a0 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
2e5b0 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
2e5c0 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
2e5d0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2e5e0 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2e5f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e600 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e610 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
2e620 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2e630 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2e640 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
2e650 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
2e660 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e680 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
2e690 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
2e6a0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2e6b0 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
2e6c0 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
2e6d0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2e6e0 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
2e6f0 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
2e700 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2e710 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
2e720 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
2e730 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
2e740 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
2e750 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
2e760 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
2e770 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
2e780 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
2e790 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
2e7a0 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
2e7b0 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
2e7c0 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2e7d0 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
2e7e0 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
2e7f0 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
2e800 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2e810 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
2e820 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2e830 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
2e840 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
2e850 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
2e860 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
2e870 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
2e880 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
2e890 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
2e8a0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
2e8b0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2e8c0 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
2e8d0 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
2e8e0 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
2e8f0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
2e900 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
2e910 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
2e920 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
2e930 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
2e940 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
2e950 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
2e960 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
2e970 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e980 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2e990 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
2e9a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e9b0 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
2e9c0 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
2e9d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2e9e0 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
2e9f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2ea00 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2ea10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ea20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ea30 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
2ea40 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
2ea50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ea60 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
2ea70 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
2ea80 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
2ea90 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
2eaa0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
2eab0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
2eac0 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
2ead0 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
2eae0 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
2eaf0 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
2eb00 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
2eb10 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
2eb20 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
2eb30 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2eb40 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
2eb50 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
2eb60 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
2eb70 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
2eb80 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2eb90 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
2eba0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
2ebb0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
2ebc0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
2ebd0 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
2ebe0 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
2ebf0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
2ec00 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
2ec10 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
2ec20 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
2ec30 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
2ec40 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
2ec50 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
2ec60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2ec70 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
2ec80 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2eca0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
2ecb0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
2ecc0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2ecd0 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
2ece0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
2ecf0 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
2ed00 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2ed10 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2ed20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
2ed30 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2ed40 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
2ed50 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
2ed60 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed80 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
2ed90 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2eda0 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
2edb0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2edd0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
2ede0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2edf0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
2ee00 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
2ee10 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
2ee20 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
2ee30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
2ee40 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
2ee50 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
2ee60 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
2ee70 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
2ee80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
2ee90 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
2eea0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2eeb0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
2eec0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
2eed0 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
2eee0 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
2eef0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ef00 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ef10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
2ef20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
2ef30 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
2ef40 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
2ef50 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
2ef60 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
2ef70 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
2ef80 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
2ef90 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
2efa0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
2efb0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
2efc0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
2efd0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2efe0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2eff0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2f000 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f010 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f020 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2f030 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
2f040 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
2f050 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2f060 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
2f070 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
2f080 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
2f090 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
2f0a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
2f0b0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2f0c0 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
2f0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
2f0e0 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
2f0f0 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
2f100 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2f110 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
2f120 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65  *)&nKey);.  btre
2f130 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2f140 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2f150 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
2f160 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
2f170 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
2f180 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
2f190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2f1a0 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
2f1b0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
2f1c0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
2f1d0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
2f1e0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
2f1f0 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
2f200 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2f210 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
2f220 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
2f230 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
2f240 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
2f250 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
2f260 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
2f270 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
2f280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f290 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f2a0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2f2b0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
2f2c0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
2f2d0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
2f2e0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
2f2f0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
2f300 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
2f310 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
2f320 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
2f330 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
2f340 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
2f350 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
2f360 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
2f370 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
2f380 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
2f390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f3a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f3b0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
2f3c0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
2f3d0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
2f3e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2f3f0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
2f400 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2f410 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
2f420 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
2f430 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
2f440 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
2f450 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
2f460 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
2f470 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
2f480 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2f490 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
2f4a0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2f4b0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2f4c0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2f4d0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
2f4e0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
2f4f0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
2f500 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f510 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
2f520 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2f530 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2f540 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
2f550 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
2f560 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2f570 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
2f580 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
2f590 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
2f5a0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
2f5b0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
2f5c0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
2f5d0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
2f5e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
2f5f0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
2f600 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
2f610 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
2f620 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
2f630 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
2f640 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
2f650 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
2f660 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
2f670 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
2f680 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
2f690 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
2f6a0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
2f6b0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
2f6c0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
2f6d0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
2f6e0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
2f6f0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
2f700 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2f710 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
2f720 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2f730 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
2f740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f750 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
2f760 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
2f770 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
2f780 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
2f790 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2f7a0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
2f7b0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
2f7c0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2f7d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f7e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f7f0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
2f800 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2f810 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f820 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2f830 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2f840 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f850 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2f860 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2f870 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2f880 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
2f890 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2f8a0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
2f8b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2f8c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2f8d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2f8e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2f8f0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2f900 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2f910 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f920 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2f930 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2f940 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
2f950 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2f960 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2f970 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2f980 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
2f990 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2f9a0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2f9b0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
2f9c0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
2f9d0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
2f9e0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2fa00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fa10 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2fa20 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2fa30 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2fa40 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
2fa50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fa60 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2fa70 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
2fa80 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
2fa90 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
2faa0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
2fab0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
2fac0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
2fad0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
2fae0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
2faf0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2fb00 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
2fb10 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
2fb20 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
2fb30 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
2fb40 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
2fb50 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2fb60 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
2fb70 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
2fb80 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2fb90 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2fba0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2fbb0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2fbc0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2fbd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
2fbe0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2fbf0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fc00 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2fc10 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2fc20 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
2fc30 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
2fc40 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2fc50 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2fc60 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
2fc70 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2fc80 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
2fc90 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
2fca0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
2fcb0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
2fcc0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2fcd0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2fce0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2fcf0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2fd00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2fd10 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
2fd20 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
2fd30 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
2fd40 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
2fd50 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2fd60 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
2fd70 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2fd80 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
2fd90 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
2fda0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2fdb0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
2fdc0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
2fdd0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
2fde0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
2fdf0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
2fe00 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
2fe10 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
2fe20 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
2fe30 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
2fe40 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2fe50 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
2fe60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fe70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2fe80 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
2fe90 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
2fea0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
2feb0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
2fec0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2fed0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
2fee0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
2fef0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2ff00 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
2ff10 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
2ff20 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
2ff30 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
2ff40 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
2ff50 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
2ff60 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
2ff70 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
2ff80 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
2ff90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2ffa0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
2ffb0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
2ffc0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2ffd0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
2ffe0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
2fff0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
30000 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
30010 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
30020 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
30030 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
30040 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
30050 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
30060 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
30070 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
30080 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
30090 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
300a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
300b0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
300c0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
300d0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
300e0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
300f0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
30100 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
30110 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
30120 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
30130 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
30140 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
30150 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
30160 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
30170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
30180 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30190 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
301a0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
301b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
301c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
301d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
301e0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
301f0 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
30200 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
30210 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
30220 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
30230 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
30240 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
30250 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
30260 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
30270 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
30280 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
30290 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
302a0 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
302b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
302c0 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
302d0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
302e0 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
302f0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30300 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
30310 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
30320 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
30330 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
30340 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
30350 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
30360 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
30370 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70  l--;.  memmove(p
30380 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
30390 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - idx
303a0 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  ));.  put2byte(&
303b0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
303c0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
303d0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
303e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
303f0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
30400 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
30410 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
30420 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
30430 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
30440 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
30450 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
30460 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
30470 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
30480 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
30490 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
304a0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
304b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
304c0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
304d0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
304e0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
304f0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
30500 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
30510 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
30520 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
30530 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
30540 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
30550 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
30560 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
30570 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
30580 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
30590 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
305a0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
305b0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
305c0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
305d0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
305e0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
305f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
30600 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
30610 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
30620 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
30630 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
30640 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
30650 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
30660 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
30670 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30680 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
30690 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
306a0 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
306b0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
306c0 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
306d0 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
306e0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
306f0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
30700 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
30710 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
30720 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
30730 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
30740 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
30750 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
30760 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
30770 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
30780 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
30790 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
307a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
307b0 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
307c0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
307d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
307e0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
307f0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
30800 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
30810 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
30820 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
30830 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
30840 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
30850 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
30860 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
30870 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
30880 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
30890 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
308a0 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
308b0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
308c0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
308d0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
308e0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
308f0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
30900 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
30910 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
30920 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
30930 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
30940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
30950 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
30960 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
30970 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
30980 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
30990 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
309a0 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
309b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
309c0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
309d0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
309e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
309f0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
30a00 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
30a10 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
30a20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
30a30 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
30a40 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b  age */.  int nSk
30a50 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34  ip = (iChild ? 4
30a60 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70   : 0);..  if( *p
30a70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
30a80 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
30a90 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
30aa0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
30ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58   );.  assert( MX
30ac0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
30ad0 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
30ae0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
30af0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
30b00 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55  e->pBt) || CORRU
30b10 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
30b20 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
30b30 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
30b40 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
30b50 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
30b60 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
30b70 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
30b80 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
30b90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30ba0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
30bb0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
30bc0 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
30bd0 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
30be0 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
30bf0 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
30c00 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
30c10 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
30c20 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
30c30 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
30c40 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
30c50 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
30c60 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
30c70 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
30c80 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
30c90 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
30ca0 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
30cb0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
30cc0 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
30cd0 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
30ce0 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
30cf0 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
30d00 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
30d10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
30d20 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
30d30 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
30d40 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
30d50 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
30d60 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
30d70 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
30d80 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
30d90 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
30da0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
30db0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
30dc0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
30dd0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
30de0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
30df0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
30e00 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
30e10 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
30e20 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
30e30 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
30e40 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
30e50 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
30e60 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
30e70 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
30e80 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
30e90 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
30ea0 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
30eb0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
30ec0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
30ed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
30ee0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
30ef0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
30f00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
30f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30f20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
30f30 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
30f40 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
30f50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30f60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30f70 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
30f80 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
30f90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
30fa0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
30fb0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
30fc0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
30fd0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
30fe0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
30ff0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
31000 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
31010 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
31020 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
31030 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
31040 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
31050 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
31060 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
31070 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
31080 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
31090 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
310a0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
310b0 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
310c0 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
310d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
310e0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
310f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
31100 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
31110 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
31120 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
31130 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
31140 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
31150 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
31160 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
31170 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
31180 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
31190 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
311a0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
311b0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
311c0 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b  a[ins+2], &data[
311d0 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a  ins], end-ins);.
311e0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
311f0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
31200 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
31210 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
31220 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
31230 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
31240 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31250 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
31260 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
31270 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
31280 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
31290 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
312a0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
312b0 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
312c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
312d0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
312e0 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
312f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
31300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
31310 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
31320 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
31330 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
31340 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
31350 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
31360 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
31370 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
31380 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
31390 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
313a0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
313b0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
313c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
313d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
313e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
313f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
31400 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
31410 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
31420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
31430 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
31440 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
31450 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
31460 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
31470 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
31480 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
31490 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
314a0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
314b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
314c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
314d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
314e0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
314f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
31500 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
31510 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
31520 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
31530 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
31540 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
31550 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
31560 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
31570 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
31580 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
31590 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
315a0 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
315b0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
315c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
315d0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
315e0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
315f0 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
31600 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
31610 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
31620 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
31630 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
31640 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
31650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
31670 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
31680 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
31690 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28  l>=0 && nCell<=(
316a0 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67  int)MX_CELL(pPag
316b0 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20  e->pBt).        
316c0 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43      && (int)MX_C
316d0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
316e0 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72  =10921);.  asser
316f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31700 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
31710 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
31720 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
31730 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74  he page has just
31740 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
31750 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20  zeroPage() */.  
31760 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
31770 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
31780 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74  ert( get2byteNot
31790 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
317a0 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a  ])==nUsable );..
317b0 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50    pCellptr = &pP
317c0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43  age->aCellIdx[nC
317d0 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
317e0 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
317f0 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
31800 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75  >=0; i--){.    u
31810 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d  16 sz = aSize[i]
31820 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  ;.    pCellptr -
31830 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
31840 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74  y -= sz;.    put
31850 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
31860 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
31870 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
31880 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
31890 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74  , sz);.  }.  put
318a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
318b0 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
318c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
318d0 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
318e0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
318f0 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
31900 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
31910 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
31920 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
31930 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
31940 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
31950 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
31960 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
31970 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
31980 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
31990 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
319a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
319b0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
319c0 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
319d0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
319e0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
319f0 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
31a00 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
31a10 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
31a20 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
31a30 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
31a40 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
31a50 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
31a60 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
31a70 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
31a80 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
31a90 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
31aa0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
31ab0 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
31ac0 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
31ad0 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
31ae0 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
31af0 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
31b00 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
31b10 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
31b20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
31b30 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
31b40 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
31b50 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
31b60 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
31b70 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
31b80 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
31b90 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
31ba0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
31bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
31bc0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
31bd0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
31be0 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
31bf0 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
31c00 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
31c10 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
31c20 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
31c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
31c40 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
31c50 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
31c60 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
31c70 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
31c80 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
31c90 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
31ca0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
31cb0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
31cc0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
31cd0 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
31ce0 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
31cf0 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
31d00 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
31d10 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
31d20 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
31d30 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
31d40 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
31d50 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
31d60 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
31d70 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
31d80 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
31d90 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
31da0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
31db0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
31dc0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
31dd0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
31de0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
31df0 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
31e00 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
31e10 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
31e20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
31e30 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
31e40 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
31e50 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
31e60 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
31e70 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
31e80 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
31e90 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
31ea0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
31eb0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
31ec0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
31ed0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
31ee0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
31ef0 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
31f00 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
31f10 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
31f20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
31f30 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
31f40 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
31f50 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
31f60 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
31f70 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
31f80 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
31f90 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
31fa0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
31fb0 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
31fc0 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
31fd0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
31fe0 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
31ff0 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
32000 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
32010 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
32020 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
32030 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
32040 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
32050 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
32060 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
32070 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
32080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
32090 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
320a0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
320b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
320c0 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
320d0 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
320e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
320f0 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
32100 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
32110 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32130 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
32140 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
32150 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
32180 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
32190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
321a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
321b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
321c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
321d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
321e0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
321f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
32200 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32210 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
32220 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
32230 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
32240 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
32250 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
32260 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77  condition is now
32270 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
32280 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66   reaching this f
32290 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
322a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
322b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
322c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
322d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
322e0 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
322f0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
32300 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
32310 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
32320 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
32330 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
32340 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
32350 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
32360 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
32370 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
32380 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
32390 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
323a0 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
323b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
323c0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
323d0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
323e0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
323f0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
32400 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
32410 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
32420 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76  ll = pPage->apOv
32430 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73  fl[0];.    u16 s
32440 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
32450 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
32460 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
32470 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
32480 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32490 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
324a0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
324b0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
324c0 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
324d0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
324e0 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
324f0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
32500 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
32510 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
32520 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
32530 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
32540 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
32550 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
32560 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
32570 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
32580 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
32590 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
325a0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
325b0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
325c0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
325d0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
325e0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
325f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
32600 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
32610 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
32620 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
32630 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
32640 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
32650 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
32660 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
32670 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
32680 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
32690 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
326a0 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
326b0 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
326c0 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
326d0 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
326e0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
326f0 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
32700 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
32710 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
32720 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
32730 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
32740 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
32750 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
32760 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32770 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
32780 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
32790 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
327a0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
327b0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
327c0 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
327d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
327e0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
327f0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
32800 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
32810 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
32820 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
32830 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
32840 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
32850 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
32860 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
32870 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
32880 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
32890 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
328a0 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
328b0 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
328c0 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
328d0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
328e0 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
328f0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
32900 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
32910 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
32920 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
32930 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
32940 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
32950 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
32960 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
32970 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
32980 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
32990 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
329a0 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
329b0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
329c0 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
329d0 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
329e0 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
329f0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
32a00 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
32a10 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
32a20 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
32a30 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
32a40 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
32a50 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
32a60 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
32a70 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
32a80 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
32a90 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
32aa0 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
32ab0 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
32ac0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
32ad0 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
32ae0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
32af0 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
32b00 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
32b10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
32b20 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
32b30 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
32b40 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
32b50 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
32b60 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
32b70 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
32b80 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
32b90 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
32ba0 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
32bb0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
32bc0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
32bd0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
32be0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
32bf0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
32c00 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
32c10 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
32c20 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
32c30 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
32c40 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
32c50 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
32c60 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
32c70 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
32c80 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
32c90 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
32ca0 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
32cb0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
32cc0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
32cd0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
32ce0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
32cf0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
32d00 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
32d10 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
32d20 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
32d30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
32d40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
32d50 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
32d60 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
32d70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
32d80 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
32d90 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
32da0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
32db0 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
32dc0 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
32dd0 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
32de0 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
32df0 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
32e00 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
32e10 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
32e20 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
32e30 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
32e40 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
32e50 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
32e60 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
32e70 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
32e80 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
32e90 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
32ea0 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
32eb0 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
32ec0 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
32ed0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
32ee0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
32ef0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
32f00 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
32f10 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
32f20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
32f30 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
32f40 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
32f50 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
32f60 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
32f70 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
32f80 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
32f90 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
32fa0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
32fb0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
32fc0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
32fd0 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
32fe0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
32ff0 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
33000 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
33010 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
33020 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
33030 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
33040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33050 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33060 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
33070 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
33080 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
33090 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
330a0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
330b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
330c0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
330d0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
330e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
330f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
33100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
33110 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
33120 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
33130 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
33140 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
33150 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
33160 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
33170 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
33180 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
33190 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
331a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
331b0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
331c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
331d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
331e0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
331f0 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
33200 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
33210 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
33220 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
33230 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
33240 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
33250 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
33260 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
33270 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
33280 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
33290 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
332a0 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
332b0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
332c0 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
332d0 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
332e0 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
332f0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
33300 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
33310 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
33320 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
33330 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
33340 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
33350 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
33360 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
33370 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
33380 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
33390 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
333a0 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
333b0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
333c0 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72  age.apOvfl[] arr
333d0 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
333e0 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
333f0 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
33400 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
33410 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
33420 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
33430 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
33440 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
33450 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
33460 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
33470 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
33480 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
33490 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
334a0 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
334b0 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
334c0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
334d0 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
334e0 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
334f0 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
33500 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
33510 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
33520 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
33530 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
33540 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
33550 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
33560 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
33570 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
33580 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
33590 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
335a0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
335b0 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
335c0 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
335d0 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
335e0 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
335f0 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
33600 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
33610 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
33620 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
33630 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
33640 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
33650 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
33660 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
33670 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
33680 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
33690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
336a0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
336b0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20  iFromHdr+5]) <= 
336c0 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
336d0 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f  Size );.  .    /
336e0 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
336f0 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
33700 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
33710 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
33720 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62     iData = get2b
33730 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
33740 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d  Hdr+5]);.    mem
33750 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
33760 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
33770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
33780 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63  iData);.    memc
33790 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c  py(&aTo[iToHdr],
337a0 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72   &aFrom[iFromHdr
337b0 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66  ], pFrom->cellOf
337c0 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e  fset + 2*pFrom->
337d0 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f  nCell);.  .    /
337e0 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  * Reinitialize p
337f0 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20  age pTo so that 
33800 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
33810 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
33820 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74  cture.    ** mat
33830 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e  ch the new data.
33840 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   The initializat
33850 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61  ion of pTo can a
33860 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64  ctually fail und
33870 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79  er.    ** fairly
33880 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73   obscure circums
33890 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f  tances, even tho
338a0 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79  ugh it is a copy
338b0 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
338c0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72  .    ** page pFr
338d0 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  om..    */.    p
338e0 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
338f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
33900 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20  itPage(pTo);.   
33910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
33930 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
33940 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  urn;.    }.  .  
33950 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
33960 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
33970 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
33980 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
33990 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66  entries.    ** f
339a0 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
339b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
339c0 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
339d0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
339e0 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  rs to..    */.  
339f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
33a00 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  UM ){.      *pRC
33a10 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
33a20 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ps(pTo);.    }. 
33a30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
33a40 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
33a50 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20  ibutes cells on 
33a60 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74  the iParentIdx't
33a70 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  h child of pPare
33a80 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72  nt.** (hereafter
33a90 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64   "the page") and
33aa0 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67   up to 2 sibling
33ab0 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  s so that all pa
33ac0 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
33ad0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e  he.** same amoun
33ae0 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
33af0 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c   Usually a singl
33b00 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74  e sibling on eit
33b10 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a  her side of the.
33b20 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64  ** page are used
33b30 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
33b40 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73  g, though both s
33b50 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
33b60 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73  me from one.** s
33b70 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20  ide if the page 
33b80 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  is the first or 
33b90 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
33ba0 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65  s parent. If the
33bb0 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65   page .** has fe
33bc0 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69  wer than 2 sibli
33bd0 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  ngs (something w
33be0 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
33bf0 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65  ppen if the page
33c00 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61  .** is a root pa
33c10 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66  ge or a child of
33c20 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68   a root page) th
33c30 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
33c40 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72   siblings.** par
33c50 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
33c60 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
33c70 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
33c80 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70  iblings of the p
33c90 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
33ca0 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
33cb0 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f  sed by .** one o
33cc0 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  r two in an effo
33cd0 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
33ce0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
33cf0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
33d00 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
33d10 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
33d20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
33d30 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
33d40 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d  on the page.** m
33d50 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
33d60 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d  y be stored in M
33d70 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20  emPage.aData[]. 
33d80 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
33d90 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
33da0 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73  s overfull. This
33db0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
33dc0 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20   that all cells 
33dd0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20  allocated.** to 
33de0 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
33df0 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e   siblings fit in
33e00 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  to MemPage.aData
33e10 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  [] before return
33e20 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ing..**.** In th
33e30 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
33e40 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  ncing the page a
33e50 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c  nd its siblings,
33e60 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a   cells may be.**
33e70 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f   inserted into o
33e80 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
33e90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28  he parent page (
33ea0 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20  pParent). Doing 
33eb0 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20  so.** may cause 
33ec0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
33ed0 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
33ee0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
33ef0 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70   If this.** happ
33f00 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ens, it is the r
33f10 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
33f20 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69   the caller to i
33f30 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63  nvoke the correc
33f40 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72  t.** balancing r
33f50 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68  outine to fix th
33f60 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20  is problem (see 
33f70 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f  the balance() ro
33f80 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  utine). .**.** I
33f90 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
33fa0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
33fb0 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
33fc0 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
33fd0 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
33fe0 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20  ed state. So if 
33ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
34000 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
34010 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
34020 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
34030 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   The third argum
34040 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
34050 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65  tion, aOvflSpace
34060 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
34070 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69  o a.** buffer bi
34080 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
34090 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68   one page. If wh
340a0 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65  ile inserting ce
340b0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
340c0 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61  ent.** page (pPa
340d0 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74  rent) the parent
340e0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
340f0 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66  erfull, this buf
34100 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  fer is.** used t
34110 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65  o store the pare
34120 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  nt's overflow ce
34130 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69  lls. Because thi
34140 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72  s function inser
34150 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20  ts.** a maximum 
34160 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20  of four divider 
34170 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
34180 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20  arent page, and 
34190 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73  the maximum.** s
341a0 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74  ize of a cell st
341b0 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69  ored within an i
341c0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
341d0 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e  always less than
341e0 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70   1/4.** of the p
341f0 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f  age-size, the aO
34200 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65  vflSpace[] buffe
34210 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
34220 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65  to be large.** e
34230 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76  nough for all ov
34240 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a  erflow cells..**
34250 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63  .** If aOvflSpac
34260 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75  e is set to a nu
34270 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  ll pointer, this
34280 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
34290 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s .** SQLITE_NOM
342a0 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  EM..*/.#if defin
342b0 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20  ed(_MSC_VER) && 
342c0 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30  _MSC_VER >= 1700
342d0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41   && defined(_M_A
342e0 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69  RM).#pragma opti
342f0 6d 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65  mize("", off).#e
34300 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
34310 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
34330 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
34340 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
34350 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
34360 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
34370 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
34380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34390 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
343a0 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
343b0 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
343c0 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
343d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
343e0 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
343f0 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
34400 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
34410 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
34420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
34430 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
34440 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  a root-page */. 
34450 20 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20   int bBulk      
34460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34470 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
34480 20 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66   call is part of
34490 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a   a bulk load */.
344a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
344b0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
344c0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
344d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
344e0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
344f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34500 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
34510 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
34520 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
34530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
34540 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
34550 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
34560 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
34570 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
34580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34590 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
345a0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
345b0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
345c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
345d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
345e0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
345f0 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
34600 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34610 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
34620 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
34630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
34640 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
34650 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
34660 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
34670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
34680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
34690 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
346a0 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
346b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
346c0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
346d0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
346e0 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
346f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34700 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
34710 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
34720 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
34730 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
34740 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
34750 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
34760 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
34770 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
34780 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
34790 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
347a0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
347b0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
347c0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
347d0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
347e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
347f0 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
34800 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
34810 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34820 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
34830 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
34840 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
34850 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
34860 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
34870 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
34880 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
34890 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
348a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
348b0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
348c0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
348d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
348e0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
348f0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
34900 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
34910 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
34920 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
34930 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
34940 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
34950 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
34960 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
34970 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
34980 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
34990 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
349a0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
349b0 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
349c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
349d0 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
349e0 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
349f0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
34a00 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
34a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
34a20 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
34a30 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
34a40 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
34a50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
34a60 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
34a70 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
34a80 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
34a90 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
34aa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
34ab0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
34ac0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
34ad0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
34ae0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
34af0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
34b00 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
34b10 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
34b20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
34b30 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
34b40 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
34b50 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
34b60 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34b80 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
34b90 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
34ba0 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
34bb0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
34bc0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
34bd0 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
34be0 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
34bf0 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
34c00 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
34c10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34c20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
34c30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34c40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34c50 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
34c60 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
34c70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
34c80 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
34c90 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
34ca0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
34cb0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
34cc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
34cd0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
34ce0 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
34cf0 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
34d00 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
34d10 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
34d20 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
34d30 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
34d40 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
34d50 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
34d60 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
34d70 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
34d80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
34d90 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
34da0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
34db0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
34dc0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
34dd0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
34de0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
34df0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
34e00 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
34e10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34e20 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
34e30 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61  ->aiOvfl[0]==iPa
34e40 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
34e50 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
34e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
34e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
34e80 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
34e90 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
34ea0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
34eb0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
34ec0 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
34ed0 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
34ee0 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
34ef0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
34f00 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
34f10 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
34f20 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
34f30 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
34f40 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
34f50 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
34f60 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
34f70 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
34f80 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
34f90 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
34fa0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
34fb0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
34fc0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
34fd0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
34fe0 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
34ff0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
35000 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
35010 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
35020 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
35030 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
35040 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
35050 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
35060 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
35070 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
35080 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
35090 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
350a0 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
350b0 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
350c0 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
350d0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
350e0 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
350f0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
35100 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
35110 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
35120 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
35130 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
35140 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
35150 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b  0 || bBulk==1 );
35160 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
35170 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
35180 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
35190 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
351a0 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
351b0 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
351c0 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75   nxDiv = i-2+bBu
351d0 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  lk;.    }else{. 
351e0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75       assert( bBu
351f0 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  lk==0 );.      n
35200 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
35210 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
35220 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a   = 2-bBulk;.  }.
35230 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
35240 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
35250 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
35260 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
35270 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
35280 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
35290 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
352a0 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
352b0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
352c0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
352d0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
352e0 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
352f0 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
35300 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
35310 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
35320 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
35330 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
35340 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Old[i], 0);.    
35350 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
35360 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
35370 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
35380 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
35390 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
353a0 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
353b0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
353c0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
353d0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
353e0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
353f0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
35400 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
35410 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
35420 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  0] && pParent->n
35430 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
35440 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
35450 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  rent->apOvfl[0];
35460 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
35470 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
35480 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
35490 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
354a0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
354b0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
354c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
354d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
354e0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
354f0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
35500 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
35510 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
35520 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
35530 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
35540 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
35550 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
35560 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
35570 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
35580 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
35590 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
355a0 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
355b0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
355c0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
355d0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
355e0 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
355f0 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
35600 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
35610 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
35620 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
35630 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
35640 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
35650 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
35660 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
35670 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
35680 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
35690 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
356a0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
356b0 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
356c0 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
356d0 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
356e0 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
356f0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
35700 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
35710 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
35720 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
35730 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
35740 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
35750 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
35760 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
35770 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
35780 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
35790 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
357a0 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
357b0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
357c0 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
357d0 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
357e0 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
357f0 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
35800 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
35810 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
35820 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
35830 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62        if( pBt->b
35840 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
35850 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
35860 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
35870 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
35880 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
35890 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
358a0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
358b0 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
358c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
358d0 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
358e0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
358f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35910 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
35920 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
35930 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
35940 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
35950 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
35960 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
35970 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35980 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
35990 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
359a0 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
359b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
359c0 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
359d0 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
359e0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
359f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35a00 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
35a10 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
35a20 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
35a30 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
35a40 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
35a50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
35a60 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
35a70 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
35a80 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
35a90 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
35aa0 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
35ab0 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
35ac0 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
35ad0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
35ae0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
35af0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
35b00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
35b10 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
35b20 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
35b30 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
35b40 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
35b50 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
35b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
35b70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
35b80 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
35b90 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
35ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
35bb0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
35bc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
35bf0 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
35c00 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
35c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
35c30 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
35c40 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
35c50 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
35c60 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
35c70 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
35c80 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
35c90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
35ca0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
35cb0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
35cc0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
35cd0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
35ce0 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
35cf0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
35d00 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
35d10 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
35d20 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
35d30 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
35d40 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
35d50 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
35d60 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
35d70 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
35d80 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
35d90 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
35da0 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
35db0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
35dc0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
35dd0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
35de0 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
35df0 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76  d remove the div
35e00 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
35e10 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
35e20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
35e30 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
35e40 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
35e50 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
35e60 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
35e70 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
35e80 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
35e90 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
35ea0 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
35eb0 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
35ec0 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
35ed0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
35ee0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
35ef0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
35f00 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
35f10 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
35f20 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
35f30 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
35f40 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
35f50 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
35f60 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
35f70 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
35f80 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
35f90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
35fa0 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
35fb0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
35fc0 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
35fd0 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
35fe0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
35ff0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
36000 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
36010 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
36020 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
36030 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
36040 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
36050 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
36060 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
36070 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
36080 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
36090 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
360a0 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
360b0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
360c0 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
360d0 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
360e0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
360f0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
36100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
36110 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
36120 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
36130 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
36140 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36150 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
36160 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
36170 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
36180 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
36190 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
361a0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
361b0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
361c0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
361d0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
361e0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
361f0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
36200 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
36210 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
36220 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
36230 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
36240 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
36250 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
36260 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
36270 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
36280 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
36290 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
362a0 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
362b0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
362c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
362d0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
362e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
362f0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
36300 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
36310 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
36320 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
36330 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
36340 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
36350 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
36360 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
36370 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
36380 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
36390 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20      u8 *aData = 
363a0 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20  pOld->aData;.   
363b0 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20     u16 maskPage 
363c0 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65  = pOld->maskPage
363d0 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c  ;.      u16 cell
363e0 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63  Offset = pOld->c
363f0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ellOffset;.     
36400 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
36410 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
36420 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
36430 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
36440 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
36450 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61  ] = findCellv2(a
36460 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20  Data, maskPage, 
36470 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a  cellOffset, j);.
36480 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
36490 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
364a0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
364b0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
364c0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
364d0 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a   }.    }       .
364e0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
364f0 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
36500 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
36510 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
36520 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
36530 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
36540 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
36550 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
36560 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
36570 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
36580 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
36590 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
365a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
365b0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
365c0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
365d0 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28  rt( iSpace1 <= (
365e0 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
365f0 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
36600 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
36610 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
36620 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
36630 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
36640 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
36650 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
36660 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
36670 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
36680 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
36690 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
366a0 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
366b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
366c0 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
366d0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
366e0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
366f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36700 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
36710 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
36720 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
36730 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
36740 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
36750 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
36760 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
36770 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
36780 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
36790 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
367a0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
367b0 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
367c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
367d0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
367e0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
367f0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
36800 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
36810 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
36820 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
36830 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
36840 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
36850 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
36860 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
36870 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
36880 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
36890 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
368a0 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
368b0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
368c0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
368d0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
368e0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
368f0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
36900 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
36910 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
36920 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
36930 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
36940 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
36950 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
36960 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
36970 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
36980 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
36990 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
369a0 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
369b0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
369c0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
369d0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
369e0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
369f0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
36a00 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
36a10 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
36a20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
36a30 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
36a40 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
36a50 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
36a60 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
36a70 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
36a80 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
36a90 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
36aa0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
36ab0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
36ac0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
36ad0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
36ae0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
36af0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
36b00 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
36b10 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
36b20 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
36b30 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
36b40 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
36b50 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
36b60 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
36b70 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
36b80 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
36b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
36ba0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
36bb0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
36bc0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
36bd0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
36be0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
36bf0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
36c00 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
36c10 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
36c20 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
36c30 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
36c40 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
36c50 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
36c60 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
36c70 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
36c80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36c90 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
36ca0 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
36cb0 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
36cc0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
36cd0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
36ce0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
36cf0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
36d00 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
36d10 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
36d20 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
36d30 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
36d40 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
36d50 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
36d60 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
36d70 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
36d80 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
36d90 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
36da0 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
36db0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
36dc0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
36dd0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
36de0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
36df0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
36e00 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
36e10 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
36e20 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
36e30 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
36e40 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
36e50 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
36e60 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
36e70 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
36e80 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
36e90 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
36ea0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
36eb0 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
36ec0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
36ed0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
36ee0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
36ef0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
36f00 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
36f10 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
36f20 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
36f30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
36f40 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
36f50 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
36f60 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
36f70 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
36f80 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
36f90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
36fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36fb0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
36fc0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
36fd0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
36fe0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
36ff0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
37000 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
37010 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
37020 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
37030 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
37040 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
37050 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
37060 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
37070 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
37080 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
37090 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
370a0 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20  zRight==0 .     
370b0 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20    || (!bBulk && 
370c0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
370d0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
370e0 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20  ell[r]+2)) .    
370f0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
37100 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
37110 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
37120 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
37130 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
37140 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
37150 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
37160 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
37170 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
37180 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
37190 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
371a0 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
371b0 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
371c0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
371d0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
371e0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
371f0 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
37200 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
37210 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
37220 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
37230 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
37240 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
37250 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
37260 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
37270 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
37280 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20  *.  ** UPDATE:  
37290 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
372a0 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ow is not necess
372b0 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68  arily true if th
372c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
372d0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
372e0 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e    The corruption
372f0 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
37300 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  d and reported l
37310 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69  ater.  ** in thi
37320 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74  s procedure so t
37330 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
37340 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e  to act upon it n
37350 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ow..  */.#if 0. 
37360 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
37370 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
37380 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
37390 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
373a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41  );.#endif..  TRA
373b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
373c0 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a  d: %d %d %d  ",.
373d0 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67      apOld[0]->pg
373e0 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  no, .    nOld>=2
373f0 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e   ? apOld[1]->pgn
37400 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  o : 0,.    nOld>
37410 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70  =3 ? apOld[2]->p
37420 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20  gno : 0.  ));.. 
37430 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
37440 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
37450 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
37460 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
37470 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64    */.  if( apOld
37480 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a  [0]->pgno<=1 ){.
37490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
374a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
374b0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
374c0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
374d0 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
374e0 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
374f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
37500 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
37510 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
37520 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
37530 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
37540 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
37550 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
37560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37570 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
37580 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37590 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
375a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
375b0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
375c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
375d0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
375e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
375f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
37600 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28   &pNew, &pgno, (
37610 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f  bBulk ? 1 : pgno
37620 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ), 0);.      if(
37630 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
37640 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
37650 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
37660 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
37670 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
37680 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
37690 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
376a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
376b0 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
376c0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
376d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
376e0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
376f0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
37700 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
37710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
37740 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
37750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
37770 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
37780 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
37790 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
377a0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
377b0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
377c0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
377d0 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
377e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
377f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
37800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
37810 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
37820 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
37830 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
37840 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
37850 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
37860 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
37870 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
37880 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
37890 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
378a0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
378b0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
378c0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
378d0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
378e0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
378f0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
37900 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
37910 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
37920 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
37930 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
37940 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
37950 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
37960 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
37970 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
37980 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
37990 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
379a0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
379b0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
379c0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
379d0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
379e0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
379f0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
37a00 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
37a10 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
37a20 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
37a30 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
37a40 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
37a50 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
37a60 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
37a70 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
37a80 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
37a90 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
37aa0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
37ab0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
37ac0 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
37ad0 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
37ae0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
37af0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
37b00 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
37b10 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
37b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
37b30 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
37b40 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
37b50 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
37b60 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
37b70 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
37b80 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
37b90 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
37ba0 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
37bb0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
37bc0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
37bd0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
37be0 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
37bf0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
37c00 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
37c10 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
37c20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
37c30 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
37c40 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
37c50 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
37c60 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
37c70 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
37c80 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
37c90 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
37ca0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
37cb0 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
37cc0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
37cd0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
37ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37cf0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37d00 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
37d10 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
37d20 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
37d30 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
37d40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
37d50 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
37d60 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
37d70 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
37d80 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
37d90 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
37da0 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
37db0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
37dc0 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
37dd0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
37de0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
37df0 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
37e00 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
37e10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
37e20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
37e30 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
37e40 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
37e50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
37e60 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
37e70 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
37e80 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
37e90 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
37ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
37eb0 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
37ec0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
37ed0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
37ee0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
37ef0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
37f00 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
37f10 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
37f20 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
37f30 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
37f40 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
37f50 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
37f60 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
37f70 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
37f80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
37fa0 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
37fb0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
37fc0 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
37fd0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
37fe0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
37ff0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
38000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
38010 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
38020 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
38030 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
38040 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
38050 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
38060 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
38070 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
38080 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
38090 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
380a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
380b0 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
380c0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
380d0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
380e0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
380f0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
38100 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
38110 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
38120 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
38130 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
38140 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
38150 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
38160 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
38170 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
38180 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
38190 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
381a0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
381b0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
381c0 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
381d0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
381e0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
381f0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
38200 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
38210 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
38220 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
38230 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
38240 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
38250 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
38260 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
38270 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
38280 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
38290 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
382a0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
382b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
382c0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
382d0 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
382e0 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
382f0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
38300 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
38310 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
38320 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
38330 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
38340 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
38350 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
38360 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
38370 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
38380 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
38390 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
383a0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
383b0 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
383c0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
383d0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
383e0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
383f0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
38400 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
38410 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
38420 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
38430 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
38440 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
38450 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
38460 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
38470 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
38480 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can n