/ Hex Artifact Content
Login

Artifact 77f175987c80ebec063f8653cb7d300776411413:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20   aSpace[200];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
5b00: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
5b10: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ld==0 ){.      s
5b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
5b30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
5b40: 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72   pFree);.      r
5b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
5b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
5b80: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
5b90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5ba0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5bb0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
5bc0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
5bd0: 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  );.  if( pFree )
5be0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5bf0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5c00: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5c10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5c30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5c40: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5c50: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5c60: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5c70: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5c80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5c90: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5ca0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5cb0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5cc0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5cd0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5ce0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5cf0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5d00: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5d10: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5d20: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5d30: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
5d40: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5d50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5d70: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5d80: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5d90: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5da0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5db0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5dc0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5dd0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5de0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5df0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
5e00: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5e10: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
5e20: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
5e30: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
5e40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5e50: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
5e60: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
5e70: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
5e80: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70  Cur->nKey, 0, &p
5e90: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a  Cur->skipNext);.
5ea0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5eb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5ec0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5ed0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5ee0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5ef0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5f00: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5f10: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
5f20: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
5f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
5f40: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
5f50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5f60: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5f70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f80: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
5f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
5fb0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
5fc0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
5fd0: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
5ff0: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
6000: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6010: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
6020: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
6030: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
6040: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
6050: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
6060: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
6070: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
6080: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
6090: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
60a0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
60b0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
60c0: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
60d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
60e0: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
60f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6100: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
6110: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6120: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
6130: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
6140: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
6150: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
6160: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
6170: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
6180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6190: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
61a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
61b0: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
61c0: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
61d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
61e0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
61f0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
6200: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
6210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6220: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6230: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
6240: 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b  | NEVER(pCur->sk
6250: 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20  ipNext!=0) ){.  
6260: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
6270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6280: 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  pHasMoved = 0;. 
6290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
62a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
62b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
62c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
62d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
62e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
62f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
6300: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
6310: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
6320: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
6330: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
6340: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
6350: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
6360: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
6370: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
6380: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
6390: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
63a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
63b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
63c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
63d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
63e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
63f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
6400: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
6410: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
6420: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
6430: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6440: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
6450: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6460: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
6470: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
6480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
64a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
64b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
64c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
64d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
64e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
64f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
6500: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
6510: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
6520: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
6530: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
6540: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
6550: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
6560: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
6570: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
6580: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
6590: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
65a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
65b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
65f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
6600: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
6610: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6620: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
6630: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
6640: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
6650: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6660: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6670: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6680: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6690: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
66a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
66b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
66c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
66d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
66e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
66f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6700: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
6710: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
6720: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6730: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
6740: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6750: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6760: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6770: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6780: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6790: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
67a0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
67b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
67c0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
67d0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
67e0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
67f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
6800: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
6810: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
6820: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
6830: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
6840: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6850: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6860: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6870: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6880: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6890: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
68a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
68b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
68c0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
68d0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
68e0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
68f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
6900: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
6910: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
6920: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6930: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6940: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6950: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6960: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6970: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6980: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6990: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
69a0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
69b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
69c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
69d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
69e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
69f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
6a00: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
6a10: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
6a20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6a40: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
6a50: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
6a60: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
6a70: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
6a80: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
6a90: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
6aa0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
6ab0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
6ac0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
6ad0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
6ae0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6af0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
6b00: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
6b10: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
6b20: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
6b30: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
6b40: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
6b50: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6b60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
6b70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b80: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
6b90: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
6ba0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
6bb0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6bc0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
6bd0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
6be0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
6bf0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6c00: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
6c10: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
6c20: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6c40: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6c50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6c60: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6c70: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6c80: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6c90: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6ca0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6cb0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6cc0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
6cd0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6ce0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6cf0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
6d00: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
6d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
6d20: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6d30: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6d40: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6d50: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6d60: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6d70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6d80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6d90: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6da0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6db0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6dc0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6dd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6de0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
6df0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
6e00: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
6e10: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
6e20: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6e30: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6e60: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6e70: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6e80: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6e90: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6ea0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6eb0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6ec0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
6ed0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6ee0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6ef0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6f00: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
6f10: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6f20: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6f30: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6f40: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6f50: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6f60: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
6f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6f80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6f90: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6fa0: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
6fb0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
6fc0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6fd0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6fe0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6ff0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
7000: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
7010: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7020: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
7030: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7040: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
7050: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
7060: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
7070: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7090: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
70a0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
70b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
70c0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
70d0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
70e0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
70f0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
7100: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
7110: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
7120: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
7130: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7140: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
7150: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
7160: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
7170: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
7180: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
7190: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
71a0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
71b0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
71c0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
71d0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
71e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
71f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
7200: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
7210: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7220: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7230: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7240: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7250: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7260: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7270: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7280: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7290: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
72a0: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
72b0: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
72c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
72d0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
72e0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
72f0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
7300: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
7310: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
7320: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7330: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7340: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7350: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7360: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7380: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7390: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
73a0: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
73b0: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
73c0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
73d0: 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67   k;.    k = pPag
73e0: 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->aiOvfl[i];.  
73f0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
7400: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
7410: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
7420: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70  return pPage->ap
7430: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  Ovfl[i];.      }
7440: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
7450: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7460: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
7470: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
7480: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
7490: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
74a0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
74b0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
74c0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
74d0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
74e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
74f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7500: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
7510: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
7520: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7530: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
7540: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
7550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7560: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
7570: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
7580: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7590: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
75a0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
75b0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
75c0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
75d0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
75e0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
75f0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
7600: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
7610: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
7620: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7630: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7640: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7650: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7660: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7670: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7690: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
76a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
76b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
76c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
76d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
76e0: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
7710: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
7720: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7730: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
7740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7750: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
7760: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
7770: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7780: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7790: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
77a0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
77b0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
77c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
77d0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
77e0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
77f0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
7800: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
7810: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
7820: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7830: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
7840: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
7860: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
7870: 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
7880: 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  l, nPayload);.  
7890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
78a0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
78b0: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
78c0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
78d0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
78e0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
78f0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
7900: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
7910: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7920: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7930: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7940: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7950: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7960: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7970: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7980: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7990: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
79a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
79b0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
79c0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
79d0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
79e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
79f0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
7a00: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
7a10: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7a20: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7a30: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7a40: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7a50: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7a60: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7a70: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7a80: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7a90: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7aa0: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
7ab0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
7ac0: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
7ad0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
7ae0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7af0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
7b00: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
7b10: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
7b30: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
7b40: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
7b50: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7b60: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7b70: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7b80: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7b90: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7ba0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7bb0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7bc0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7bd0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7be0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7bf0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7c00: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7c10: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7c20: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
7c30: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
7c40: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
7c50: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7c60: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7c70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7c80: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7c90: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7ca0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7cb0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7cc0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7cd0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7ce0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7cf0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7d00: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7d10: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7d20: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d30: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d40: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
7d50: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7d60: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d70: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d80: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7d90: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7da0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7db0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7dc0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7dd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7de0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7df0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7e00: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7e10: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7e20: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7e30: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7e40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7e50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7e60: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7e70: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7e80: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7e90: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7ea0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7eb0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7ec0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7ed0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7ef0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7f00: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7f10: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7f20: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7f30: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7f40: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7f50: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7f60: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7f70: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7f80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7f90: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7fa0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fb0: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7fc0: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7fd0: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7ff0: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8010: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8020: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8030: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8050: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
8060: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
8070: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8080: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8090: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
80a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
80b0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
80c0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
80d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
80e0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
80f0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8100: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8110: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8120: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8130: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8140: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8150: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8160: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8170: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8180: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8190: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
81a0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
81b0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
81c0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
81d0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
81e0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
81f0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8200: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
8210: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
8220: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
8230: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
8240: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
8250: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8260: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8270: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
8280: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
8290: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
82a0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
82b0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
82c0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
82d0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
82e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
82f0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
8300: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
8310: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
8320: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
8330: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
8340: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
8350: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
8360: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8370: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8380: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8390: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
83a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
83b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
83c0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
83d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
83e0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
83f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8400: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8410: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8420: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
8430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
8440: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8450: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8460: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8470: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8480: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
84a0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
84b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
84c0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
84d0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
84e0: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
84f0: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8500: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8510: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8520: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8530: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
8540: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8550: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8560: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8570: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8580: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8590: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
85a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
85b0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
85c0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
85d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
85e0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
85f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8600: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
8610: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
8620: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
8630: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8640: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
8650: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8660: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8670: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8680: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8690: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
86a0: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
86b0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
86c0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
86d0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
86e0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
86f0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8700: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8710: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8720: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
8730: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
8740: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8750: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
8760: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8770: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8780: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8790: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
87a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
87b0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
87c0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
87d0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
87e0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
87f0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8800: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8810: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8820: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8830: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
8840: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
8850: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
8860: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8870: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8890: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
88a0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
88b0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
88c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
88d0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
88e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
88f0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8900: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8910: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8920: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
8930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
8940: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
8950: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8960: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8970: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8980: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8990: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
89a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
89b0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
89c0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
89d0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
89e0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
89f0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8a00: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8a10: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8a20: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
8a30: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
8a40: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
8a50: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
8a60: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8a70: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8a80: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8a90: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8aa0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8ab0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8ac0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8ad0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8ae0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8af0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8b00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8b10: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8b20: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
8b30: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
8b40: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
8b50: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8b60: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8b70: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8b80: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8b90: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8ba0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8bb0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8bc0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8bd0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8be0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8bf0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8c00: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8c10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8c20: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
8c30: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8c60: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8c70: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8ca0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8cb0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8cc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8cd0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8ce0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8cf0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8d00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8d20: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
8d30: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
8d40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8d50: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8d60: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8d70: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8d90: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8da0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8db0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8dc0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8dd0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8de0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8df0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8e00: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8e10: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8e20: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8e40: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8e50: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8e60: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8e70: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8e80: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8e90: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8ea0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8eb0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8ec0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8ed0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8ee0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8ef0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8f00: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8f10: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8f30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8f70: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8f80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8f90: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8fa0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8fb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8fc0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8fd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8fe0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8ff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
9000: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
9010: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9020: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9030: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9040: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9050: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9060: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
9070: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9080: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
9090: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
90a0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
90b0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
90c0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
90d0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
90e0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
90f0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
9100: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
9110: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
9120: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
9130: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
9140: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
9150: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
9160: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
9170: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
9180: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
9190: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
91c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91d0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
91e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
91f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9200: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9210: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9220: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9230: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9240: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9250: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9260: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9270: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9280: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9290: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
92a0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
92b0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
92c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
92d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
92f0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
9300: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9310: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9320: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9330: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9340: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9350: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9360: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9370: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9380: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9390: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
93a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
93b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
93c0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
93d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
93e0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
93f0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9410: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9420: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9430: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9440: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9450: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9460: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9470: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9480: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
94a0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
94b0: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
94c0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
94d0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
94e0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
94f0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9500: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9510: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9520: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9530: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9540: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9550: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9560: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9570: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9580: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9590: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
95a0: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
95b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
95c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
95d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
95e0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
95f0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9610: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9630: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9640: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9650: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9660: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9670: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9680: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9690: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
96a0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
96b0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
96c0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
96d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
96e0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
96f0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9700: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9710: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9720: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
9730: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
9740: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
9750: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
9760: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9770: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9780: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
97a0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
97b0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
97c0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
97d0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
97e0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
97f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9800: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9810: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9820: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
9830: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
9840: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
9850: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
9860: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9870: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9880: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9890: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
98a0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
98b0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
98c0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
98d0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
98e0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
98f0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9900: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9910: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9920: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
9930: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
9940: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
9950: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
9960: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9970: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9980: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9990: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
99a0: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99d0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
99e0: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
99f0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9a20: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
9a30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9a40: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
9a50: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9a60: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9a70: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9a80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9a90: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9aa0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9ab0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9ac0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9ad0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9ae0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9af0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9b00: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9b10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9b20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9b30: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9b40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9b50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9b60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9b70: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9b80: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9b90: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9ba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9bb0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9bd0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9be0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9bf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9c00: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
9c10: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
9c20: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
9c30: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9c40: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
9c50: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9c60: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9c70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9c80: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9c90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9ca0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9cb0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9cc0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9cd0: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9ce0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9cf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9d00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9d10: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
9d20: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
9d30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9d40: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
9d50: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
9d60: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9d70: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9d80: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9d90: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9da0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9db0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9dc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9dd0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9de0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9df0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9e00: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9e10: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9e20: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9e30: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9e40: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9e50: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9e60: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9e70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9e80: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9e90: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9ea0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9eb0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9ec0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ough to accommod
9ed0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
9ee0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
9ef0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
9f00: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
9f10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9f20: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9f30: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20       int size;  
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9f50: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
9f60: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9f70: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
9f80: 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a  || pc<addr+4 ){.
9f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9fa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9fb0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
9fc0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
9fd0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
9fe0: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
9ff0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a000: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a010: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74  nByte;.        t
a020: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a030: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a040: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
a050: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
a060: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
a070: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
a080: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
a090: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
a0a0: 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
a0b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a0c0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a0d0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
a0e0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
a0f0: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
a100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
a110: 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28  a[hdr+7] = (u8)(
a120: 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20  nFrag + x);.    
a130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69      }else if( si
a140: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
a150: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
a160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a170: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a190: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
a1a0: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
a1b0: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
a1c0: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
a1d0: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20  count.          
a1e0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
a1f0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
a200: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
a210: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  /.          put2
a220: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a230: 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , x);.        }.
a240: 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20          *pIdx = 
a250: 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20  pc + x;.        
a260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a280: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
a290: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a2a0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
a2b0: 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f  ce in the gap to
a2c0: 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68   satisfy.  ** th
a2d0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49  e allocation.  I
a2e0: 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e  f not, defragmen
a2f0: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
a300: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
a310: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
a320: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
a330: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
a340: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
a350: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a360: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
a370: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
a380: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
a390: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
a3a0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
a3b0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
a3c0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
a3d0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
a3e0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
a3f0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
a400: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
a410: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
a420: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
a430: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
a440: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
a450: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
a460: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
a470: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
a480: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
a490: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
a4a0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
a4b0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
a4c0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
a4d0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
a4e0: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
a4f0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
a500: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
a510: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
a520: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a530: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
a540: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
a550: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
a560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a570: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
a580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a5a0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
a5b0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
a5c0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
a5d0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
a5e0: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
a5f0: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
a600: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
a610: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
a620: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
a630: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
a640: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
a650: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
a660: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
a670: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
a680: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
a690: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
a6a0: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
a6b0: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
a6c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
a6d0: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
a6e0: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
a6f0: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
a700: 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20  ;.  int iLast;  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
a730: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
a740: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
a750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
a760: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
a770: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
a780: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
a790: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a7a0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
a7b0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
a7c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a7d0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
a7e0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
a7f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
a800: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
a810: 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74   + size) <= (int
a820: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
a830: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a840: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a850: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a860: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a870: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a880: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a890: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a8a0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a8b0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
a8c0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
a8d0: 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  E ){.    /* Over
a8e0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a8f0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a900: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a910: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a920: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a930: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a940: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a950: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a960: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a970: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a980: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a990: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a9a0: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a9b0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a9c0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a9d0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a9e0: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a9f0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
aa00: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
aa10: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
aa20: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
aa30: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
aa40: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
aa50: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
aa60: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
aa70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
aa80: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
aa90: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
aaa0: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
aab0: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
aac0: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
aad0: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
aae0: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
aaf0: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
ab00: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
ab10: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
ab20: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
ab30: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
ab40: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
ab50: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
ab60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ab70: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
ab80: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
ab90: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
aba0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
abb0: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
abc0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
abd0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
abe0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
abf0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
ac00: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
ac10: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
ac20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ac30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ac40: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
ac50: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
ac60: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
ac70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ac90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
aca0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
acb0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
acc0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
acd0: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
ace0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
acf0: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
ad00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
ad10: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
ad20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
ad30: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
ad40: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
ad50: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
ad60: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
ad70: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
ad80: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
ad90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
ada0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
adb0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
adc0: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
add0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
ade0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
adf0: 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74  ( pbegin <= (int
ae00: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ae10: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
ae20: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
ae30: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
ae40: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
ae50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ae60: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
ae70: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
ae80: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
ae90: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
aea0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
aeb0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
aec0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  e);.      if( (f
aed0: 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e  rag<0) || (frag>
aee0: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
aef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
af00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
af20: 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b  .      data[hdr+
af30: 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a  7] -= (u8)frag;.
af40: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
af50: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
af60: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
af70: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
af80: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e  x);.      x = pn
af90: 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26  ext + get2byte(&
afa0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d  data[pnext+2]) -
afb0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70   pbegin;.      p
afc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
afd0: 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  egin+2], x);.   
afe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
aff0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
b000: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
b010: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b020: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
b030: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
b040: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
b050: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
b060: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
b070: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
b080: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
b090: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
b0a0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b0b0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
b0c0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
b0d0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
b0e0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
b0f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b100: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
b110: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b120: 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  n+2]);.    put2b
b130: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b140: 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73  , top);.  }.  as
b150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b160: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
b1a0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
b1b0: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
b1c0: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
b1d0: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
b1e0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
b1f0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
b200: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
b210: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
b220: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
b230: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
b240: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
b250: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
b260: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
b270: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
b280: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
b290: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
b2a0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
b2b0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
b2c0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
b2d0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
b2e0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
b2f0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
b300: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
b310: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
b320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
b330: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
b340: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
b350: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
b360: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
b370: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
b380: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
b390: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
b3a0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
b3b0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
b3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b3d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b3e0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b3f0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
b400: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
b410: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
b420: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
b430: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
b440: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
b450: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
b460: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
b470: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
b480: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
b490: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
b4a0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
b4b0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
b4c0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b4d0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
b4e0: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
b4f0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b500: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b510: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
b520: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
b530: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
b540: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
b550: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b570: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
b580: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
b590: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
b5a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
b5b0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
b5c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b5d0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
b5e0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
b5f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b600: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
b610: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b620: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
b630: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
b640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b650: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
b660: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
b670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
b680: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
b690: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
b6a0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
b6b0: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
b6c0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
b6d0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
b6e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
b6f0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
b700: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
b710: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
b720: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
b730: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
b740: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
b750: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b760: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
b770: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
b780: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
b790: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
b7a0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
b7b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
b7c0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
b7d0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
b7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b800: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b810: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b820: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b830: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
b840: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
b850: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
b860: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b870: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
b880: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
b890: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b8b0: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
b8c0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
b8d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b8e0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
b8f0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
b900: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
b910: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b920: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
b930: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
b940: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
b950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
b960: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b970: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b980: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
b990: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
b9a0: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
b9b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
b9c0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b9d0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
b9e0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
b9f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
ba00: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
ba10: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
ba20: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
ba30: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
ba40: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
ba50: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
ba60: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
ba70: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
ba80: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
baa0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
bab0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
bac0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
bad0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bae0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
baf0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
bb00: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
bb10: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
bb20: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
bb30: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
bb40: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
bb50: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
bb60: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
bb70: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
bb80: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
bb90: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
bba0: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
bbb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bbc0: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
bbd0: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
bbe0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
bbf0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
bc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bc10: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bc20: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
bc30: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bc40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
bc50: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
bc60: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
bc70: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
bc80: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
bc90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
bca0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
bcb0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
bcc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
bcd0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
bce0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
bcf0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bd00: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
bd10: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
bd20: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
bd30: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
bd40: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bd50: 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  t];.    top = ge
bd60: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
bd70: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
bd80: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
bd90: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bda0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
bdb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
bdc0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
bdd0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
bde0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
bdf0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
be00: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
be10: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
be20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be30: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
be40: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
be50: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
be60: 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  pBt) );..    /* 
be70: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
be80: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
be90: 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
bea0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
beb0: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
bec0: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
bed0: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
bee0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
bef0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
bf00: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
bf10: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
bf20: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
bf30: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
bf40: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
bf50: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
bf60: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
bf70: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
bf80: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
bf90: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
bfa0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
bfb0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
bfc0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
bfd0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66  bleSize - 4;.#if
bfe0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bff0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
c000: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
c010: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c030: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
c040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
c050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
c060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c070: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
c080: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
c090: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
c0a0: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
c0b0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
c0c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
c0d0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c0e0: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
c0f0: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
c100: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c110: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
c120: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c130: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
c140: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
c150: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c160: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c180: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c190: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
c1a0: 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
c1b0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
c1c0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
c1d0: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
c1e0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c1f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
c200: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
c210: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c220: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c230: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
c240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c250: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
c260: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
c270: 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20    }  .#endif..  
c280: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c290: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
c2a0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
c2b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c2c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
c2d0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
c2e0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
c2f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30  .    while( pc>0
c300: 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65   ){.      u16 ne
c310: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  xt, size;.      
c320: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c330: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c340: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c350: 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c  Start of free bl
c360: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
c370: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
c380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c390: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c3a0: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
c3b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c3c0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
c3d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c3e0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
c3f0: 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
c400: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
c410: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c420: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c430: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
c440: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
c450: 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
c460: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
c470: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c480: 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
c490: 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
c4a0: 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
c4b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c4c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c4d0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
c4e0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
c4f0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
c500: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
c510: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
c520: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
c530: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
c540: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c550: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
c560: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c570: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
c580: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
c590: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
c5a0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
c5b0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
c5c0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
c5d0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
c5e0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
c5f0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
c600: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
c610: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
c620: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
c630: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
c640: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
c650: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
c660: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
c670: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
c680: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
c690: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
c6a0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
c6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6c0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
c6d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6f0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c700: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c710: 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
c720: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
c730: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
c750: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c760: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
c770: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
c780: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
c790: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
c7a0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
c7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c7c0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
c7d0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
c7e0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
c7f0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
c800: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
c810: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
c820: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
c830: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c840: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
c850: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
c860: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
c870: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
c880: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
c890: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
c8a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c8b0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
c8c0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
c8d0: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
c8e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
c8f0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
c900: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
c910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c920: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c930: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c940: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c960: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c970: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
c980: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
c990: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
c9a0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c9b0: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
c9c0: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
c9d0: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
c9e0: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
c9f0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
ca00: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
ca10: 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
ca20: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
ca30: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
ca40: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
ca50: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ca60: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
ca70: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
ca80: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
ca90: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
caa0: 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
cab0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
cac0: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
cad0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
cae0: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
caf0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
cb00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
cb10: 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
cb20: 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
cb30: 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
cb40: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
cb50: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
cb60: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
cb70: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
cb80: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
cb90: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
cba0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
cbb0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
cbc0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
cbd0: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
cbe0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
cbf0: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
cc00: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
cc10: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
cc20: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
cc30: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
cc40: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
cc50: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
cc60: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
cc70: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
cc80: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
cc90: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
cca0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
ccb0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
ccc0: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
ccd0: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
cce0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
ccf0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
cd00: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
cd10: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
cd20: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
cd30: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
cd40: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
cd50: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
cd60: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
cd70: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
cd80: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cd90: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
cda0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cdb0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
cdc0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
cdd0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
cde0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
cdf0: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
ce00: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
ce10: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
ce20: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
ce30: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
ce40: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
ce50: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
ce60: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
ce70: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
ce80: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
ce90: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
cea0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
ceb0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
cec0: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
ced0: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
cee0: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
cef0: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
cf00: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
cf10: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
cf20: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
cf30: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
cf40: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
cf50: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
cf60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
cf70: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
cf80: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
cf90: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
cfa0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
cfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cfc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
cfd0: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
cfe0: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
cff0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
d000: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
d010: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
d020: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
d030: 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
d040: 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
d050: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
d060: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d070: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
d080: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
d090: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
d0a0: 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
d0b0: 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
d0c0: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
d0d0: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
d0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d0f0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d100: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
d110: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
d120: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
d130: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
d140: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
d150: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d160: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
d170: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d180: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
d190: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
d1a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d1b0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
d1c0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d1d0: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
d1e0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
d1f0: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
d200: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
d210: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
d220: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
d230: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
d240: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
d250: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
d260: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
d270: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
d280: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
d290: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
d2a0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
d2b0: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
d2c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d2d0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d2e0: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
d2f0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
d300: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
d310: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
d320: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
d330: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
d340: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
d350: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
d360: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
d380: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
d390: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
d3a0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
d3b0: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
d3c0: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
d3d0: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
d3e0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
d3f0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
d400: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
d410: 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
d420: 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
d430: 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
d440: 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
d450: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
d460: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
d470: 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
d480: 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
d490: 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
d4a0: 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61  urn (int)btreePa
d4b0: 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
d4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
d4d0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
d4e0: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
d4f0: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
d500: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a  tine is just a.*
d510: 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  * convenience wr
d520: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
d530: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62  arate calls to b
d540: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
d550: 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  d .** btreeInitP
d560: 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
d570: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
d580: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
d590: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
d5a0: 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  o is undefined. 
d5b0: 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
d5c0: 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
d5d0: 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
d5e0: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
d5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d600: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
d610: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
d640: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
d650: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
d660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d670: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
d680: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
d690: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6b0: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
d6c0: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
d6d0: 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20    int bReadonly 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52    /* PAGER_GET_R
d700: 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a  EADONLY or 0 */.
d710: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
d720: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d730: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d740: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d750: 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41  t( bReadonly==PA
d760: 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
d770: 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30   || bReadonly==0
d780: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
d790: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d7a0: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
d7b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d7c0: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
d7d0: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
d7e0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
d7f0: 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79  pPage, bReadonly
d800: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
d820: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
d830: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
d840: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
d850: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
d860: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d870: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
d880: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
d890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d8a0: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
d8b0: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
d8c0: 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
d8d0: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
d8e0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
d8f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
d900: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
d910: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
d920: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
d930: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
d940: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
d950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d960: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
d970: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
d980: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
d990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d9a0: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
d9b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
d9c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d9d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
d9e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d9f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
da00: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
da10: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
da20: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
da30: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
da40: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
da50: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
da60: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
da70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
da80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
da90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
daa0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
dab0: 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  refNotNull(pPage
dac0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
dad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
dae0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
daf0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
db00: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
db10: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
db20: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
db30: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
db40: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
db50: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
db60: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
db70: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
db80: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
db90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dba0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
dbb0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
dbc0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
dbd0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
dbe0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
dbf0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
dc00: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
dc10: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
dc20: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
dc30: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
dc40: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
dc50: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
dc60: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
dc70: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
dc80: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
dc90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
dca0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
dcb0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
dcc0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
dcd0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
dce0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
dcf0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
dd00: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
dd10: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
dd20: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
dd30: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
dd40: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
dd50: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
dd60: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
dd70: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
dd80: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
dd90: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
dda0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
ddb0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
ddc0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
ddd0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
dde0: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
ddf0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
de00: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
de10: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
de20: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
de30: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
de40: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
de50: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
de60: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
de70: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
de80: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
de90: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
dea0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
deb0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
dec0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
ded0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
dee0: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
def0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
df00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
df10: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
df20: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
df30: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
df40: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
df50: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
df60: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
df70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
df80: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
df90: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
dfa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
dfb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
dfc0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
dfd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
dfe0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
dff0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
e000: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
e010: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
e020: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
e030: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
e040: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
e060: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e070: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
e080: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
e090: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
e0a0: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
e0b0: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
e0c0: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
e0d0: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
e0e0: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
e0f0: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
e100: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
e110: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
e120: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
e130: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
e140: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
e150: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
e160: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
e170: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
e180: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
e190: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
e1a0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
e1b0: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
e1c0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
e1d0: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
e1e0: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
e1f0: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
e200: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
e210: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
e220: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
e230: 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
e240: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
e250: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
e260: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
e270: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
e280: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
e290: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e2a0: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
e2b0: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
e2c0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
e2d0: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
e2e0: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
e2f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
e300: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
e310: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
e320: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
e330: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
e340: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
e350: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
e360: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
e370: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
e380: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
e390: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e3a0: 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
e3b0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
e3c0: 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
e3d0: 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
e3e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e3f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
e400: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
e410: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
e420: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
e430: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
e440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
e450: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
e460: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
e470: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
e480: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
e490: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
e4a0: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
e4b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
e4c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e4d0: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
e4e0: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
e4f0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
e500: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
e510: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
e520: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
e530: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e550: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
e560: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
e570: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e590: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
e5a0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
e5b0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e5c0: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
e5d0: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
e5e0: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
e5f0: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
e600: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
e620: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
e630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
e640: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
e670: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
e680: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
e690: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
e6a0: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
e6b0: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
e6c0: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
e6d0: 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
e6e0: 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
e6f0: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
e700: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
e710: 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
e720: 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
e730: 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
e740: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
e750: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
e760: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
e770: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
e780: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
e790: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
e7a0: 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
e7b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e7c0: 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
e7d0: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
e7e0: 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
e7f0: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
e800: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
e810: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
e820: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
e850: 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
e860: 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
e890: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
e8a0: 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
e8b0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
e8c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
e8d0: 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
e8e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e8f0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
e900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
e910: 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
e920: 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
e930: 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
e940: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
e950: 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
e960: 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
e970: 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
e980: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
e990: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e9a0: 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
e9b0: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
e9c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
e9d0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e9e0: 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
e9f0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
ea00: 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
ea10: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
ea20: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
ea30: 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
ea40: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
ea50: 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
ea60: 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
ea70: 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
ea80: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
ea90: 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
eaa0: 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
eab0: 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
eac0: 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
ead0: 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
eae0: 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
eaf0: 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
eb00: 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
eb10: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
eb20: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
eb30: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
eb40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
eb50: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
eb60: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
eb70: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
eb80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
eb90: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
eba0: 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
ebb0: 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
ebc0: 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
ebd0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
ebe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
ebf0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
ec00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ec10: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
ec20: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
ec30: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
ec40: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
ec50: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
ec60: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
ec70: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
ec80: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
ec90: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
eca0: 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
ecb0: 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
ecc0: 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
ecd0: 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
ece0: 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
ecf0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
ed00: 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
ed10: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
ed20: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
ed30: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
ed40: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
ed50: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
ed60: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
ed70: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54  name);.      MUT
ed80: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
ed90: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
eda0: 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d  ared; ).      p-
edb0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
edc0: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
edd0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
ede0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
edf0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
ee00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ee10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ee20: 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
ee30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
ee40: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
ee50: 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  ename, sqlite3St
ee60: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
ee70: 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )+1);.      }els
ee80: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
ee90: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
eea0: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
eeb0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
eee0: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
eef0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
ef00: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
ef10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ef20: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
ef30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ef40: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ef50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
ef60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ef70: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
ef80: 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
ef90: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
efa0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
efb0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
efc0: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
efd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
efe0: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
eff0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
f000: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f010: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f020: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
f030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f040: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
f050: 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
f060: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
f070: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
f080: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
f090: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
f0a0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
f0b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f0c0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
f0d0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
f0e0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
f0f0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
f100: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
f110: 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
f120: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
f130: 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
f140: 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
f150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
f160: 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
f170: 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
f180: 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
f190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
f1a0: 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
f1b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
f1c0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
f1d0: 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
f1e0: 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
f1f0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
f200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f210: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f220: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
f230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f240: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
f250: 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
f260: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f270: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
f290: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
f2b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
f2c0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
f2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f2e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f2f0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
f300: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
f310: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
f320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f330: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f340: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f350: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
f360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f370: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f380: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
f390: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
f3a0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
f3b0: 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
f3c0: 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
f3d0: 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
f3e0: 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
f3f0: 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
f400: 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
f410: 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
f420: 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
f430: 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
f440: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
f450: 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
f460: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
f470: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
f480: 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
f490: 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
f4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
f4b0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
f4c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
f4d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
f4e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
f4f0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
f500: 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
f510: 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
f520: 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
f530: 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
f540: 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
f550: 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
f560: 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
f570: 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
f580: 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
f590: 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
f5a0: 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
f5b0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
f5c0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f5d0: 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (i64)==8 || size
f5e0: 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(i64)==4 );.  
f5f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f600: 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65  (u64)==8 || size
f610: 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20  of(u64)==4 );.  
f620: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f630: 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u32)==4 );.    
f640: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f650: 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73  16)==2 );.    as
f660: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e  sert( sizeof(Pgn
f670: 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20  o)==4 );.  .    
f680: 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  pBt = sqlite3Mal
f690: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
f6a0: 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28  *pBt) );.    if(
f6b0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pBt==0 ){.     
f6c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f6d0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  EM;.      goto b
f6e0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f6f0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
f700: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
f710: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
f720: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
f750: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
f760: 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
f770: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f790: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f7a0: 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
f7b0: 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
f7c0: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
f7d0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
f7e0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
f7f0: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
f800: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
f810: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
f820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f830: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
f840: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f850: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
f860: 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
f870: 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
f880: 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
f890: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
f8a0: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
f8b0: 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
f8c0: 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
f8d0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
f8e0: 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
f8f0: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
f900: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
f910: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
f920: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f930: 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
f940: 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
f950: 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
f960: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
f970: 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42  RE_DELETE.    pB
f980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
f990: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
f9a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74  ;.#endif.    pBt
f9b0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
f9c0: 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
f9d0: 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
f9e0: 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
f9f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
fa00: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
fa10: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
fa20: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
fa30: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
fa40: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
fa50: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
fa60: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
fa70: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
fa80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
fa90: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
faa0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
fab0: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
fac0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
fad0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
fae0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
faf0: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
fb00: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
fb10: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
fb20: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
fb30: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fb40: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
fb50: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
fb60: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
fb70: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
fb80: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
fb90: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
fba0: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
fbb0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
fbc0: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
fbd0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
fbe0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
fbf0: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
fc00: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
fc10: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
fc20: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
fc30: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
fc40: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
fc50: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
fc60: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
fc70: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
fc80: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
fc90: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
fca0: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
fcb0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
fcc0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
fcd0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
fce0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
fcf0: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
fd00: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
fd10: 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
fd20: 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
fd30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fd40: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
fd50: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
fd60: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
fd70: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
fd80: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
fd90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
fda0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
fdb0: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
fdc0: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
fdd0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fde0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
fdf0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
fe00: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
fe10: 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
fe20: 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
fe30: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
fe40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fe50: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
fe60: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
fe70: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
fe80: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
fe90: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
fea0: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
feb0: 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
fec0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fed0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
fee0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
fef0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
ff00: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
ff10: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
ff20: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
ff30: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
ff40: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
ff50: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
ff60: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
ff70: 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
ff80: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
ff90: 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
ffa0: 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
ffb0: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
ffc0: 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
ffd0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
ffe0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
fff0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
10000 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
10010 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
10020 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
10030 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
10040 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
10050 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
10060 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10070 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
10080 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
10090 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
100a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
100b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
100c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
100d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
100e0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
100f0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
10100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10110 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10120 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10130 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
10140 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
10150 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10160 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
10170 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10180 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10190 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
101a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
101b0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
101c0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
101d0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
101e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
101f0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10200 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
10210 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10220 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
10230 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
10240 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
10250 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
10260 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
10270 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
10280 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
10290 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
102a0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
102b0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
102c0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
102d0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
102e0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
102f0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
10300 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10310 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
10320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10330 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10340 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
10350 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
10360 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
10370 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
10380 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
10390 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
103a0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
103b0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
103c0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
103d0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
103e0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
103f0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
10400 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
10410 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
10420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10430 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
10440 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
10450 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
10460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
10470 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
10480 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10490 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
104a0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
104b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
104c0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
104d0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
104e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
104f0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10500 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
10510 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
10520 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
10530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
10540 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10550 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
10560 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
10570 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
10580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10590 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
105a0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
105b0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
105c0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
105d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
105e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
105f0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
10600 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
10610 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
10620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
10630 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
10640 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
10650 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
10660 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
10670 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
10680 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
10690 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
106a0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
106b0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
106c0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
106d0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
106e0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
106f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
10700 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
10710 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
10720 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
10730 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
10740 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
10750 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
10760 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
10770 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
10780 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
10790 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
107a0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
107b0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
107c0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
107d0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
107e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
107f0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
10800 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
10810 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
10820 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
10830 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
10840 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
10850 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
10860 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
10870 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
10880 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
10890 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
108a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
108b0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
108c0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
108d0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
108e0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
108f0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
10900 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
10910 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
10920 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
10930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
10940 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
10950 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
10960 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
10970 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10980 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
10990 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
109a0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
109b0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
109c0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
109d0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
109e0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
109f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10a00 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
10a10 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
10a20 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
10a30 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
10a40 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10a50 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10a60 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
10a70 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10a80 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10a90 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
10aa0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
10ab0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
10ac0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10ad0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10ae0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
10af0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
10b00 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
10b10 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
10b20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
10b30 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
10b40 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
10b50 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
10b60 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
10b70 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
10b80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10b90 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
10ba0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
10bb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
10bc0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
10bd0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
10be0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
10bf0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10c00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
10c10 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
10c20 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
10c30 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
10c40 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
10c50 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
10c60 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
10c70 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
10c80 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a  IZE(pBt) bytes..
10c90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
10ca0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
10cb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
10cc0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
10cd0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
10ce0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
10cf0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
10d00 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
10d10 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
10d20 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
10d30 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
10d40 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
10d50 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
10d60 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
10d70 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
10d80 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
10d90 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
10da0 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
10db0 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
10dc0 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
10dd0 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
10de0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
10df0 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
10e00 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
10e10 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
10e20 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
10e30 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
10e40 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
10e50 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
10e60 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
10e70 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
10e80 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
10e90 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
10ea0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
10eb0 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
10ec0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
10ed0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
10ee0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
10ef0 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
10f00 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
10f10 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
10f20 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
10f30 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
10f40 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
10f50 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
10f60 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
10f70 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
10f80 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
10f90 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
10fa0 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
10fb0 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69   here.  */.    i
10fc0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
10fd0 65 20 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e  e ) memset(pBt->
10fe0 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29  pTmpSpace, 0, 4)
10ff0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
11000 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
11010 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
11020 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
11030 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
11040 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11050 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
11060 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
11070 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
11080 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
11090 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
110a0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
110b0 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
110c0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
110d0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
110e0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
110f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11100 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
11110 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
11120 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
11130 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
11140 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
11150 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11160 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11170 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11180 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11190 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
111a0 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
111b0 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
111c0 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
111d0 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
111e0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
111f0 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
11200 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
11210 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
11220 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
11230 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
11240 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
11250 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
11260 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
11270 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
11280 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11290 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
112a0 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
112b0 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
112c0 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
112d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
112e0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
112f0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
11300 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11310 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11320 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
11330 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
11340 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
11350 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
11360 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
11370 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
11380 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
11390 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
113a0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
113b0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
113c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
113d0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
113e0 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
113f0 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
11400 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
11410 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
11420 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
11430 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
11440 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
11450 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
11460 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
11470 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
11480 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
11490 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
114a0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
114b0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
114c0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
114d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
114e0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
114f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
11500 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
11510 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
11520 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
11530 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
11540 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
11550 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
11560 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
11570 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
11580 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
11590 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
115a0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
115b0 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
115c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
115d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
115e0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
115f0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
11600 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
11610 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
11620 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
11630 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
11640 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
11650 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
11660 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
11670 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
11680 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
11690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
116a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
116b0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
116c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
116d0 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
116e0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
116f0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
11700 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
11710 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
11720 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
11730 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
11740 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
11750 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
11760 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
11770 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
11780 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
11790 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
117a0 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
117b0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
117c0 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
117d0 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
117e0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
117f0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
11800 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
11810 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
11820 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
11830 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
11840 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
11850 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
11860 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
11870 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
11880 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
11890 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
118a0 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
118b0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
118c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
118d0 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
118e0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
118f0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
11900 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
11910 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
11920 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
11930 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
11940 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
11950 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
11960 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11970 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
11980 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11990 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
119a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
119b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
119c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
119d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
119e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
119f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11a00 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11a10 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
11a20 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
11a30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11a60 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
11a70 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
11a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
11a90 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
11aa0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
11ab0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11ac0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
11ad0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
11ae0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
11af0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11b00 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11b10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11b20 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11b30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11b40 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11b50 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
11b60 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
11b70 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
11b80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11b90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11bb0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11bc0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11bd0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
11be0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
11bf0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
11c00 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
11c10 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
11c20 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11c30 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
11c40 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
11c50 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
11c60 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11c70 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11c80 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11c90 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11ca0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11cb0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11cc0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11cd0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
11ce0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
11cf0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11d00 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
11d10 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
11d20 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11d30 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
11d40 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
11d50 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
11d60 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11d80 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11da0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
11db0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
11dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
11dd0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
11de0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
11df0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
11e00 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
11e10 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
11e20 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
11e30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11e60 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11e80 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
11e90 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
11ea0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
11eb0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
11ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11ef0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11f00 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
11f10 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
11f20 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
11f30 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
11f40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
11f50 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
11f60 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
11f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f80 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
11f90 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
11fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11fb0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
11fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11fd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11fe0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
11ff0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12000 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
12010 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
12020 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
12030 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
12040 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
12050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12060 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12070 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
12080 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
12090 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
120a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
120b0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
120c0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
120d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
120e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
120f0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
12100 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
12110 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
12120 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
12130 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
12140 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
12150 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
12160 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
12170 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
12180 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
12190 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
121a0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
121b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
121c0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
121d0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
121e0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
121f0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
12200 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
12210 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
12220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12230 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
12240 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
12250 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
12260 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
12270 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
12280 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
12290 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
122a0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
122b0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
122c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
122d0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
122e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
122f0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
12300 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
12310 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
12320 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
12330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
12340 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
12350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
12360 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
12370 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
12380 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
12390 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
123a0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
123b0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
123c0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
123d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
123e0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
123f0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
12400 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
12410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
12420 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12430 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
12440 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
12450 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
12460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12470 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
12480 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12490 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
124a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
124b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
124c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
124d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
124e0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
124f0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
12500 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
12510 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12520 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12530 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
12540 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
12550 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
12560 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
12570 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
12580 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
12590 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
125a0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
125b0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
125c0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
125d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
125e0 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
125f0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
12600 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12610 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
12620 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
12630 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
12640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
12650 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
12660 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
12670 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
12680 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
12690 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
126a0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
126b0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
126c0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
126d0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
126e0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
126f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12720 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
12730 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
12740 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12750 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
12760 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
12770 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
12780 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
12790 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
127a0 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  C) || defined(SQ
127b0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
127c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
127d0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
127e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
127f0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
12800 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
12810 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
12820 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
12830 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
12840 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
12850 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
12860 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
12870 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
12880 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
12890 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
128a0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
128b0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
128c0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
128d0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
128e0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
128f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
12900 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
12910 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
12920 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
12930 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
12940 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
12950 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
12960 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
12970 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
12980 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
12990 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
129a0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
129b0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
129c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
129d0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
129e0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  x(Btree *p){.  a
129f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12a00 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
12a10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
12a20 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
12a30 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
12a40 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65  usableSize;.}.#e
12a50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48  ndif /* SQLITE_H
12a60 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49  AS_CODEC || SQLI
12a70 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
12a80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12a90 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12aa0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
12ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
12ac0 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  UUM)./*.** Retur
12ad0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12ae0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
12af0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
12b00 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
12b10 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
12b20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
12b30 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
12b40 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
12b50 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
12b60 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
12b70 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
12b80 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
12b90 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
12ba0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
12bb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12bc0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
12bd0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
12be0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
12bf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
12c10 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
12c20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
12c30 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
12c40 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
12c50 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
12c60 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
12c70 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
12c80 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
12c90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
12ca0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
12cb0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
12cc0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
12cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12ce0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
12cf0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
12d00 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
12d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12d20 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
12d30 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
12d40 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
12d50 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
12d60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12d70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12d80 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12d90 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
12da0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
12db0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
12dc0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
12dd0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
12de0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
12df0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
12e00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
12e10 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12e20 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
12e30 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
12e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12e50 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
12e60 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
12e70 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
12e80 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
12e90 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
12ea0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12eb0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
12ec0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
12ed0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
12ee0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
12ef0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
12f00 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
12f10 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
12f20 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
12f30 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
12f40 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
12f50 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
12f60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12f70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
12f80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
12f90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12fa0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
12fb0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
12fc0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
12fd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
12fe0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
12ff0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
13000 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
13010 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
13020 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
13030 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
13040 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
13050 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
13060 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
13070 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
13080 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
13090 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
130a0 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
130b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
130c0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
130d0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
130e0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
130f0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
13100 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
13110 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
13120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13130 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
13140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
13150 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
13160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13170 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
13180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13190 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
131a0 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
131b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
131c0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
131d0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
131e0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
131f0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
13200 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
13210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
13220 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
13230 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
13240 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
13250 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
13260 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
13270 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
13280 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13290 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
132a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
132b0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
132c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
132d0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
132e0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
132f0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
13300 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
13310 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
13320 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
13330 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
13340 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13350 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13360 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
13370 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
13380 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
13390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
133a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
133b0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
133c0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
133d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
133e0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
133f0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
13400 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
13410 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
13420 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
13430 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13440 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13450 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
13460 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
13470 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
13480 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
13490 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
134a0 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
134b0 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
134c0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
134d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
134e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
134f0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
13500 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
13510 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
13520 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
13530 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
13540 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
13550 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
13560 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
13570 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
13580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
13590 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
135a0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
135b0 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
135c0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
135d0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
135e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
135f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
13600 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
13610 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
13620 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
13630 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
13640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
13650 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
13660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13670 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
13680 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
13690 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
136a0 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
136b0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
136c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
136d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
136e0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
136f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
13700 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
13710 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
13720 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13730 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
13740 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13750 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13760 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
13770 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
13780 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
13790 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
137a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
137b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
137c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
137d0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
137e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
137f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
13800 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
13810 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
13820 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
13830 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
13840 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
13850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
13860 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
13870 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
13880 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
13890 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
138a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
138b0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
138c0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
138d0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
138e0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
138f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
13900 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
13910 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
13920 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
13930 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
13940 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
13950 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
13960 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
13970 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
13980 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
13990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
139a0 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
139b0 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
139c0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
139d0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
139e0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
139f0 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
13a00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
13a10 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13a20 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
13a30 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13a40 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
13a50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
13a60 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
13a70 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13a80 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
13a90 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
13aa0 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
13ab0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13ac0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
13ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13ae0 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
13af0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13b00 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13b10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
13b20 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
13b30 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
13b40 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
13b50 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
13b60 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
13b70 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
13b80 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
13b90 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
13ba0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
13bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
13bc0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
13bd0 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
13be0 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
13bf0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
13c00 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
13c10 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
13c20 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
13c30 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
13c40 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
13c50 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
13c60 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
13c70 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
13c80 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
13c90 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
13ca0 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
13cb0 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
13cc0 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
13cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13ce0 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
13cf0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
13d00 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
13d10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
13d20 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
13d30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d40 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
13d50 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
13d60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13d80 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13d90 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
13da0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
13db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
13dc0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
13dd0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
13de0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13df0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
13e00 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
13e10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
13e20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
13e30 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
13e40 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
13e50 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
13e60 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
13e70 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
13e80 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
13e90 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
13ea0 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
13eb0 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
13ec0 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
13ed0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
13ee0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
13ef0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
13f00 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
13f10 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
13f20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
13f30 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
13f40 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
13f50 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
13f60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
13f70 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13f80 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13f90 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
13fa0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
13fb0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
13fc0 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
13fd0 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
13fe0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
13ff0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14000 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
14010 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
14020 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14030 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
14050 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
14060 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
14070 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
14080 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
14090 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
140a0 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
140b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
140c0 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
140d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
140e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
140f0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
14100 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
14110 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
14120 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
14130 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
14140 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
14150 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
14160 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
14170 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
14180 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
14190 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
141a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
141b0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
141c0 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
141d0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
141e0 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
141f0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
14200 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
14210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
14220 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
14230 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
14240 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
14250 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14260 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
14270 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
14280 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
14290 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
142a0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
142b0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
142c0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142e0 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
142f0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
14300 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
14320 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
14330 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
14340 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
14350 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
14360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
14370 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14380 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14390 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
143a0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
143b0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
143c0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
143d0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
143e0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
143f0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
14400 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14410 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
14420 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14430 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14440 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
14450 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
14460 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
14470 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
14480 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
14490 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
144a0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
144b0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
144c0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
144d0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
144e0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
144f0 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
14500 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
14510 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
14520 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
14530 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
14540 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
14550 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
14560 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
14570 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
14580 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
14590 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
145a0 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
145b0 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
145c0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
145d0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
145e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
145f0 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
14600 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
14610 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
14620 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
14630 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
14640 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
14650 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
14660 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
14670 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
14680 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
14690 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
146a0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
146b0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
146c0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
146d0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
146e0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
146f0 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
14700 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
14710 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
14720 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
14730 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
14740 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
14750 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
14760 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14770 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14780 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
14790 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
147a0 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
147b0 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
147c0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
147d0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
147e0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
147f0 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
14800 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
14810 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
14820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
14830 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
14840 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
14850 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
14860 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
14870 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
14880 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
14890 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
148a0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
148b0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
148c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
148d0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
148e0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
148f0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
14900 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
14910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14920 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
14930 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
14940 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
14950 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
14960 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
14970 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
14980 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
14990 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
149a0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
149b0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
149c0 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
149d0 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
149e0 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
149f0 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
14a00 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
14a10 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
14a20 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
14a30 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
14a40 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
14a50 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
14a60 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
14a70 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
14a80 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
14a90 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
14aa0 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
14ab0 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
14ac0 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
14ad0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
14ae0 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
14af0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14b00 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
14b10 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
14b20 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
14b30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
14b40 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
14b50 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
14b60 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
14b70 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
14b80 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
14b90 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 77 72 46  ==0 || pCur->wrF
14ba0 6c 61 67 29 20 26 26 20 70 43 75 72 2d 3e 65 53  lag) && pCur->eS
14bb0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
14bc0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
14bd0 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
14be0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
14bf0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
14c00 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
14c10 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
14c20 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
14c30 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14c40 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
14c50 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
14c60 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
14c70 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
14c80 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
14c90 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
14ca0 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
14cb0 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
14cc0 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
14cd0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
14ce0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
14cf0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14d00 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
14d10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14d20 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
14d30 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
14d40 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
14d50 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
14d60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14d70 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
14d90 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
14da0 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
14db0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
14dc0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
14dd0 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
14de0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
14df0 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
14e00 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
14e10 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
14e20 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
14e30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
14e40 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
14e50 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
14e60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
14e70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
14e80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14e90 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
14ea0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
14eb0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
14ec0 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
14ed0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
14ee0 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
14ef0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
14f00 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
14f10 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
14f20 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
14f30 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
14f40 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
14f50 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
14f60 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
14f70 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
14f80 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
14f90 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
14fa0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
14fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14fc0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14fd0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
14fe0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
14ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15000 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
15010 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
15020 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
15030 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
15040 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15050 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
15060 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
15070 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15080 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
15090 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
150a0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
150b0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
150c0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
150d0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
150e0 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
150f0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
15100 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
15110 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
15120 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
15130 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
15140 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
15150 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
15160 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
15170 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
15180 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
15190 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
151a0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
151b0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
151c0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
151d0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
151e0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
151f0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
15200 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
15210 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
15220 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
15230 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
15240 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
15250 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
15260 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15270 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
15280 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
15290 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
152a0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
152b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
152c0 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
152d0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
152e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
152f0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
15300 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
15310 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
15320 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
15330 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
15340 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
15350 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
15360 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
15370 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
15380 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
15390 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
153a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
153b0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
153c0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
153d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
153e0 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
153f0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
15400 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
15410 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
15420 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
15430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
15440 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
15450 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
15460 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
15470 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
15480 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
15490 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
154a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
154b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
154c0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
154d0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
154e0 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
154f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15500 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15510 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
15520 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
15530 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
15540 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
15550 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
15560 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
15570 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
15580 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
15590 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
155a0 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
155b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
155c0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
155d0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
155e0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
155f0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
15600 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
15610 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
15620 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
15630 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
15640 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
15650 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
15660 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
15670 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
15680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
15690 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
156a0 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
156b0 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
156c0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
156d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
156e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
156f0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
15700 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
15710 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
15720 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
15730 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
15740 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
15750 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
15760 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
15770 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
15780 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
15790 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
157a0 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
157b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
157c0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
157d0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
157e0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
157f0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15800 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
15810 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15820 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
15830 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15840 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
15850 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
15860 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
15870 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
15880 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
15890 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
158a0 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
158b0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
158c0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
158d0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
158e0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
158f0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
15900 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
15910 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
15920 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
15930 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
15940 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
15950 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
15960 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
15970 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
15980 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
15990 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
159a0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
159b0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
159c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
159d0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
159e0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
159f0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
15a00 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
15a10 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
15a20 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
15a30 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
15a40 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
15a50 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
15a60 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
15a70 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
15a80 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
15a90 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
15aa0 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
15ab0 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
15ac0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
15ad0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
15ae0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
15af0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
15b00 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
15b10 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
15b20 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
15b30 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
15b40 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
15b50 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
15b60 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
15b70 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
15b80 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
15b90 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
15ba0 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
15bb0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
15bc0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
15bd0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73  int wrflag){.  s
15be0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
15bf0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
15c00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15c10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15c20 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
15c30 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
15c40 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
15c50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
15c60 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
15c70 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
15c80 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
15c90 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
15ca0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
15cb0 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
15cc0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
15cd0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
15ce0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
15cf0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
15d00 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
15d10 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
15d20 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
15d30 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
15d40 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
15d50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15d60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
15d70 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
15d80 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
15d90 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
15da0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
15db0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
15dc0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
15dd0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
15de0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
15df0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
15e00 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
15e10 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
15e20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15e30 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
15e40 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
15e50 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15e70 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
15e80 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
15e90 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
15ea0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
15eb0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
15ec0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
15ed0 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
15ee0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
15ef0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15f00 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
15f10 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
15f20 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
15f30 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
15f40 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
15f50 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
15f60 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  E).   || (pBt->b
15f70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
15f80 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20  NDING)!=0.  ){. 
15f90 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
15fa0 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
15fb0 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
15fc0 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
15fd0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
15fe0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
15ff0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
16000 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
16010 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
16020 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
16030 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
16040 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
16050 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16070 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
16080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
16090 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
160a0 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
160b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
160c0 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
160d0 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
160e0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
160f0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
16100 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
16110 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16120 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
16130 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
16140 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
16150 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
16160 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
16170 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
16180 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
16190 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
161a0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
161b0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
161c0 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
161d0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
161e0 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
161f0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
16200 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
16210 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16220 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
16230 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
16240 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
16250 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
16260 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
16270 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
16280 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
16290 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
162a0 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
162b0 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
162c0 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
162d0 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
162e0 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
162f0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
16300 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
16310 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
16320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16330 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
16340 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
16350 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
16360 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
16370 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
16380 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
16390 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
163a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
163b0 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
163c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
163d0 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
163e0 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
163f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
16400 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
16410 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
16420 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
16430 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
16440 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
16450 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
16460 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
16470 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16480 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
16490 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
164a0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
164b0 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
164c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
164d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
164e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
164f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16500 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
16510 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
16520 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
16530 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
16540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16560 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
16570 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
16580 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16590 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
165a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
165b0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
165c0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
165d0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
165e0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
165f0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
16600 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
16610 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
16620 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
16630 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
16640 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
16650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
16660 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
16670 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
16680 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
16690 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
166a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
166b0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
166c0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
166d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
166e0 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d  p->lock.pBtree==
166f0 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p && p->lock.iTa
16700 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
16710 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20    p->lock.eLock 
16720 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
16730 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65       p->lock.pNe
16740 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
16750 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c  .        pBt->pL
16760 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a  ock = &p->lock;.
16770 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
16780 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
16790 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
167a0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
167b0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
167c0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
167d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
167e0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
167f0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
16800 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  Trans;.    }.   
16810 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20   if( wrflag ){. 
16820 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
16830 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
16840 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e1;.#ifndef SQLI
16850 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
16860 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72  ACHE.      asser
16870 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
16880 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
16890 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
168a0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
168b0 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56  &= ~BTS_EXCLUSIV
168c0 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66  E;.      if( wrf
168d0 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73  lag>1 ) pBt->bts
168e0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43  Flags |= BTS_EXC
168f0 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a  LUSIVE;.#endif..
16900 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16910 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66  db-size header f
16920 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63  ield is incorrec
16930 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  t (as it may be 
16940 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20  if an old.      
16950 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65  ** client has be
16960 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  en writing the d
16970 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75  atabase file), u
16980 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f  pdate it now. Do
16990 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ing.      ** thi
169a0 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  s sooner rather 
169b0 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73  than later means
169c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
169d0 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20  ze can safely . 
169e0 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20       ** re-read 
169f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
16a00 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66  e from page 1 if
16a10 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20   a savepoint or 
16a20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
16a30 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63    ** rollback oc
16a40 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
16a50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
16a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
16a70 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34  pBt->nPage!=get4
16a80 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
16a90 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20  ata[28]) ){.    
16aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16ab0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
16ac0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
16ad0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16af0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
16b00 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
16b10 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
16b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e      }.  }...tran
16b40 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
16b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16b60 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
16b70 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
16b80 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
16b90 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
16ba0 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
16bb0 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
16bc0 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
16bd0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
16be0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
16bf0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
16c00 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
16c10 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
16c20 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
16c30 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
16c40 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
16c50 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
16c60 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
16c70 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
16c80 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
16c90 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
16ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16cb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16cc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16cd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16ce0 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
16cf0 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
16d00 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
16d10 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
16d20 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
16d30 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
16d40 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
16d50 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
16d60 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
16d70 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
16d80 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
16d90 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
16da0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
16db0 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
16dc0 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
16dd0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
16de0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e00 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
16e10 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
16e20 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
16e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16e40 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
16e50 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
16e60 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
16e90 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
16ea0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
16eb0 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
16ec0 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
16ed0 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
16ee0 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
16ef0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16f00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
16f10 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
16f20 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
16f30 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
16f40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
16f60 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
16f70 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
16f80 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
16f90 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
16fa0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
16fb0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
16fc0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
16fd0 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
16fe0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
16ff0 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
17000 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
17010 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
17020 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
17030 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
17040 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17050 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
17060 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
17070 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
17080 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
17090 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
170a0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
170b0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
170c0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
170d0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
170e0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
170f0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
17100 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
17110 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
17120 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
17130 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
17140 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
17150 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17160 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
17170 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
17180 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
17190 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
171a0 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
171b0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
171c0 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
171d0 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
171e0 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
171f0 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
17200 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
17210 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
17220 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
17230 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
17240 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17250 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
17260 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17270 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
17280 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
17290 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
172a0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
172b0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
172c0 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
172d0 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
172e0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
172f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
17300 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
17310 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
17320 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
17330 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
17340 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
17350 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
17360 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
17380 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
17390 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
173a0 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
173b0 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
173c0 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
173d0 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
173e0 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
173f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17400 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
17410 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17420 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
17430 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
17440 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
17450 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
17460 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17470 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
17480 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
17490 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
174a0 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
174b0 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
174c0 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
174d0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
174e0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
174f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17510 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
17520 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
17530 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17540 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
17550 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
17560 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
17570 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74  t nCell;..    bt
17580 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
17590 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  e);.    nCell = 
175a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
175b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
175c0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
175d0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
175e0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
175f0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
17600 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
17610 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
17620 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
17630 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
17640 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
17650 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
17660 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
17670 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
17680 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
17690 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
176a0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
176b0 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
176c0 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
176d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
176e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
176f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17700 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
17710 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
17720 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
17730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17740 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
17750 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
17760 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
17770 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
17780 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
17790 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
177a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
177b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
177c0 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
177d0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
177e0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
177f0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
17800 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
17810 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
17820 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
17830 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
17840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17850 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
17860 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
17870 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
17880 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
17890 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
178a0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
178b0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
178c0 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
178d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
178e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
178f0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
17900 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
17910 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
17920 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
17930 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
17940 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
17950 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
17960 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
17970 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
17980 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
17990 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
179a0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
179b0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
179c0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
179d0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
179e0 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
179f0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
17a00 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
17a10 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
17a20 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
17a30 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
17a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
17a50 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
17a60 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
17a70 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
17a80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
17a90 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
17aa0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
17ab0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
17ae0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
17af0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
17b00 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
17b10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17b20 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
17b30 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
17b40 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
17b50 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
17b60 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
17b70 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
17b80 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
17b90 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
17ba0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
17bb0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
17bc0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
17bd0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
17be0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
17bf0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
17c00 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
17c10 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
17c20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
17c30 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
17c40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
17c50 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
17c60 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
17c70 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
17c80 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
17c90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17ca0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
17cb0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
17cc0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
17cd0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
17ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17cf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17d00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17d10 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
17d20 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
17d30 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
17d40 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
17d50 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
17d60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
17d70 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
17d80 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
17d90 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
17da0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
17db0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
17dc0 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
17dd0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
17de0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
17df0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17e00 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
17e10 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
17e20 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17e30 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
17e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17e50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17e60 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
17e70 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
17e80 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
17e90 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
17ea0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
17eb0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
17ec0 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
17ed0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
17ee0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
17ef0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
17f00 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
17f10 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
17f20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
17f30 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
17f40 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
17f50 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
17f60 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
17f70 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
17f80 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
17f90 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
17fa0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
17fb0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
17fc0 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
17fd0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
17fe0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
17ff0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
18000 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
18010 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
18020 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
18030 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
18040 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18050 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
18060 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
18070 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18090 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
180a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
180b0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
180c0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
180d0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
180e0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
180f0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
18100 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
18110 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
18120 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
18130 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
18140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18150 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18160 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
18170 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
18180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
18190 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
181a0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
181b0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
181c0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
181d0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
181e0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
181f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
18200 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
18210 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
18220 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
18230 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
18240 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
18250 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
18260 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
18270 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
182a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
182b0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
182c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
182d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
182e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
182f0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
18300 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
18310 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
18320 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
18330 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
18340 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
18350 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
18360 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
18370 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18390 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
183a0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
183b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
183c0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
183d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
183e0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
183f0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
18400 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
18410 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
18420 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
18430 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
18440 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
18450 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
18460 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
18470 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
18480 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
18490 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
184a0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
184b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
184c0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
184d0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
184e0 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
184f0 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
18500 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
18510 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
18520 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
18530 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
18540 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
18550 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
18560 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
18570 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
18580 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
18590 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
185a0 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
185b0 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
185c0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
185d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
185e0 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
185f0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
18600 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
18610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18620 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
18630 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
18640 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
18650 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
18660 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
18670 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
18680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
18690 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
186a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
186b0 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
186c0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
186d0 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
186e0 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
186f0 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
18700 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
18710 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
18720 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
18730 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
18740 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
18750 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f  on-commmit .** o
18760 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
18770 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
18780 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
18790 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
187a0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
187b0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
187c0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
187d0 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
187e0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
187f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
18800 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
18810 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
18820 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
18830 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
18840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18850 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18860 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
18870 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
18880 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
18890 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
188a0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
188b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
188c0 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
188d0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
188e0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
188f0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
18900 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
18910 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
18920 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
18930 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18940 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
18950 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
18960 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
18970 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
18980 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
18990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
189a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
189b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
189c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
189d0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
189e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
189f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18a00 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
18a10 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
18a20 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
18a30 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
18a40 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
18a50 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
18a60 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
18a70 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
18a80 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
18a90 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
18aa0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
18ab0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
18ac0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
18ad0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
18ae0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
18af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
18b00 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
18b10 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
18b20 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
18b30 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
18b40 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
18b50 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
18b60 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
18b70 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
18b80 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
18b90 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
18ba0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
18bb0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
18bc0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
18bd0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
18be0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18c20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
18c30 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
18c40 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
18c50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
18c60 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
18c70 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
18c80 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
18c90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
18ca0 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
18cb0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
18cc0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
18cd0 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
18ce0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
18cf0 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
18d00 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
18d10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
18d20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
18d30 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
18d40 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
18d50 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
18d60 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
18d70 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
18d80 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18d90 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
18da0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
18db0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18dc0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18dd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
18de0 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
18df0 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
18e00 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
18e10 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
18e20 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
18e30 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
18e40 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
18e50 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
18e60 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
18e70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18e80 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
18e90 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
18ea0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18eb0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
18ec0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
18ed0 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
18ee0 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
18ef0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
18f00 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
18f10 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
18f20 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
18f30 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
18f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
18f50 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
18f60 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
18f70 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
18f80 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
18f90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
18fa0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
18fb0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
18fc0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
18fd0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
18fe0 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
18ff0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19010 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19020 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
19030 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19050 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
19060 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
19070 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
19080 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
19090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
190a0 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
190b0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
190c0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
190d0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
190e0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
190f0 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
19100 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
19110 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
19120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19140 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19160 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
19170 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
19180 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
19190 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
191a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
191b0 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
191c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
191d0 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
191e0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
191f0 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
19200 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
19210 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19220 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19230 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
19240 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
19250 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
19260 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
19270 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
19280 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
19290 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
192a0 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
192b0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
192c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
192d0 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
192e0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
192f0 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
19300 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
19310 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
19320 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
19330 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
19340 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
19350 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
19360 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19370 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
19380 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
19390 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
193a0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
193b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
193c0 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
193d0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
193e0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
19410 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
19420 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
19430 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
19440 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
19450 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
19460 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
19470 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
19480 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
19490 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
194a0 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
194b0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
194c0 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
194d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
194e0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
194f0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
19500 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
19510 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
19520 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
19530 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
19540 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
19550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
19560 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
19570 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
19580 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
19590 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
195a0 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
195b0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
195c0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
195d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
195e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
195f0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
19600 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
19610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
19620 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
19630 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
19640 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
19650 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
19660 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
19670 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
19680 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19690 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
196a0 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
196b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
196c0 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
196d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
196e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
196f0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
19700 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
19720 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19730 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
19740 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19750 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
19760 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
19770 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
19780 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
19790 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
197a0 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
197b0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
197c0 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
197d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
197e0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
197f0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
19800 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
19810 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
19820 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
19830 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
19840 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19850 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
19860 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
19870 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
19880 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
19890 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
198a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
198b0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
198c0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
198d0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
198e0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
198f0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
19900 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
19910 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
19920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19940 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
19950 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
19960 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
19970 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
19980 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
19990 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
199a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
199b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
199c0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
199d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
199e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
199f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
19a00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19a10 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
19a20 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
19a30 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
19a40 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
19a50 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
19a60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
19a70 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
19a80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
19a90 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
19aa0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
19ab0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
19ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19ad0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
19ae0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
19af0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
19b00 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
19b10 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
19b20 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
19b30 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
19b40 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
19b50 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
19b60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19b70 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
19b80 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
19b90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19ba0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
19bb0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
19bc0 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
19bd0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
19be0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19bf0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
19c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19c10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19c20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
19c30 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
19c40 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
19c50 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
19c60 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
19c70 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
19c80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
19c90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
19ca0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
19cb0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
19cc0 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
19cd0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
19ce0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19cf0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
19d00 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
19d10 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
19d20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
19d30 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
19d40 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
19d50 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
19d60 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
19d70 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
19d80 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
19d90 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
19da0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
19db0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
19dc0 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
19dd0 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
19de0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
19df0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
19e00 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
19e10 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
19e20 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
19e30 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
19e40 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
19e50 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
19e60 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
19e70 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
19e80 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
19e90 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
19ea0 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
19eb0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
19ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19ed0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19ee0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
19ef0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
19f00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
19f10 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
19f20 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
19f30 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
19f40 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
19f50 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
19f60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19f70 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
19f80 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
19f90 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
19fa0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
19fb0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
19fc0 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
19fd0 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
19fe0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
19ff0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1a000 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1a010 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
1a020 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
1a030 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
1a040 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
1a050 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
1a060 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a070 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1a080 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1a090 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1a0a0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a0b0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
1a0c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1a0d0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1a0e0 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
1a0f0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1a100 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1a110 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
1a120 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1a130 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
1a140 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
1a150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1a160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a170 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1a180 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1a190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1a1a0 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
1a1b0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1a1c0 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
1a1d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1a1e0 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
1a1f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a200 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
1a210 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1a220 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
1a230 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1a240 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1a250 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
1a260 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
1a270 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
1a280 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
1a290 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
1a2a0 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
1a2b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1a2c0 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
1a2d0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
1a2e0 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
1a2f0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
1a300 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
1a310 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
1a320 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
1a330 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
1a340 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
1a350 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
1a360 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
1a370 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1a380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
1a390 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
1a3a0 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
1a3b0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
1a3c0 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
1a3d0 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
1a3e0 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
1a3f0 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
1a400 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a410 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
1a420 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
1a430 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
1a440 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
1a450 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
1a460 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
1a470 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
1a480 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
1a490 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
1a4a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1a4b0 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
1a4c0 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
1a4d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a4e0 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
1a4f0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
1a500 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
1a510 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
1a520 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1a530 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
1a540 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
1a550 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
1a560 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
1a570 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
1a580 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1a590 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
1a5a0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
1a5b0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
1a5c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a5d0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
1a5e0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
1a5f0 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
1a600 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
1a610 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
1a620 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
1a630 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a640 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
1a650 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
1a660 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
1a670 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
1a680 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a690 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
1a6a0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
1a6b0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
1a6c0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
1a6d0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
1a6e0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1a6f0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
1a700 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
1a710 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
1a720 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
1a730 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
1a740 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a750 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
1a760 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
1a770 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1a780 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
1a790 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1a7a0 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
1a7b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1a7c0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
1a7d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1a7e0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1a7f0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1a800 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a810 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
1a820 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a830 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1a840 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1a850 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
1a860 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1a870 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
1a880 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
1a890 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a8b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a8c0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
1a8d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1a8e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a8f0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1a900 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1a910 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
1a920 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
1a930 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1a940 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a960 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
1a970 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
1a980 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
1a990 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a9a0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1a9b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1a9c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1a9d0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
1a9e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1a9f0 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
1aa00 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
1aa10 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
1aa20 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
1aa30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aa40 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1aa50 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
1aa60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1aa70 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1aa80 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1aa90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1aaa0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1aab0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1aac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1aad0 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1aae0 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1aaf0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
1ab00 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1ab10 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
1ab20 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
1ab30 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
1ab40 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
1ab50 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
1ab60 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1ab70 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
1ab80 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
1ab90 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1aba0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
1abb0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
1abc0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
1abd0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1abe0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
1abf0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
1ac00 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ac10 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
1ac20 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
1ac30 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1ac40 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1ac50 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
1ac60 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
1ac70 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
1ac80 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
1ac90 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
1aca0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1acb0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
1acc0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
1acd0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
1ace0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1acf0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1ad00 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
1ad10 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
1ad20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
1ad30 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
1ad40 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
1ad50 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
1ad60 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1ad70 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
1ad80 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1ad90 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
1ada0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
1adb0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
1adc0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1add0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
1ade0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1adf0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
1ae00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1ae10 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
1ae20 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
1ae30 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
1ae40 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
1ae50 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
1ae60 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
1ae70 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
1ae80 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1ae90 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
1aea0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
1aeb0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
1aec0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1aed0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1aee0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1aef0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1af00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1af10 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1af20 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1af30 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1af40 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1af50 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1af60 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1af70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1af80 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1af90 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1afa0 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1afb0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1afc0 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1afd0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1afe0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1aff0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1b000 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1b010 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1b020 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1b030 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1b040 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1b050 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1b060 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1b070 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1b080 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1b090 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1b0a0 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1b0b0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1b0c0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1b0d0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1b0e0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1b0f0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1b100 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1b110 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1b120 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1b130 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1b140 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1b150 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1b160 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1b170 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1b180 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1b190 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1b1a0 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1b1b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1b1c0 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1b1d0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1b1e0 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1b1f0 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1b200 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1b210 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1b220 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1b230 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1b240 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1b250 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1b260 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1b270 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1b280 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1b290 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1b2a0 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1b2b0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1b2c0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1b2d0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1b2e0 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1b2f0 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1b300 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1b310 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1b320 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1b330 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1b340 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1b350 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1b360 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1b370 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1b380 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1b390 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1b3a0 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1b3b0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1b3c0 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1b3d0 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1b3e0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1b3f0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1b400 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1b410 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b420 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1b430 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1b440 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1b450 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1b460 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1b470 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b480 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1b490 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1b4a0 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1b4b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b4c0 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1b4d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1b4e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1b4f0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1b500 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1b510 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1b520 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b530 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1b540 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1b550 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1b560 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1b570 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1b580 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1b590 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b5a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1b5b0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1b5c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b5d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1b5e0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1b5f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b600 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1b610 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1b620 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1b630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b640 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1b650 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1b660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b670 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1b680 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1b690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b6a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1b6b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
1b6c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1b6d0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1b6e0 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1b6f0 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1b700 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1b710 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1b720 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b730 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1b740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b750 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1b760 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1b770 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b780 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1b790 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1b7a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b7b0 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1b7c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b7d0 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
1b7e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b7f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1b800 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1b810 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
1b820 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1b830 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b840 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b850 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1b860 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
1b870 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
1b880 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
1b890 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
1b8a0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
1b8b0 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
1b8c0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1b8d0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
1b8e0 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
1b8f0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
1b900 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
1b910 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
1b920 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b930 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
1b940 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
1b950 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
1b960 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
1b970 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
1b980 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
1b990 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
1b9a0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
1b9b0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
1b9c0 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
1b9d0 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
1b9e0 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
1b9f0 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
1ba00 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
1ba10 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
1ba20 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1ba30 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
1ba40 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
1ba50 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
1ba60 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
1ba70 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
1ba80 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
1ba90 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
1baa0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
1bab0 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
1bac0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1bad0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
1bae0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
1baf0 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
1bb00 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
1bb10 72 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ree==0 ) return;
1bb20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1bb30 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1bb40 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1bb50 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1bb60 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1bb70 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1bb80 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1bb90 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1bba0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1bbb0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1bbc0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1bbd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1bbe0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1bbf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1bc00 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1bc10 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1bc20 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1bc30 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1bc40 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1bc50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1bc60 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1bc70 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1bc80 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1bc90 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1bca0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1bcb0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1bcc0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1bcd0 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1bce0 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1bcf0 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1bd00 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1bd10 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1bd20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1bd30 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1bd40 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1bd50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1bd60 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1bd70 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1bd80 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1bd90 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1bda0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bdb0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1bdc0 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
1bdd0 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Code){.  int rc;
1bde0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1bdf0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1be00 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1be10 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1be20 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
1be30 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
1be40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
1be50 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
1be60 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1be70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1be80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1be90 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
1bea0 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1beb0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1bec0 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
1bed0 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  );.  }.  btreeIn
1bee0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1bef0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1bf00 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1bf10 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1bf20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1bf30 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1bf40 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1bf50 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1bf60 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1bf70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1bf80 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1bf90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1bfa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bfb0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1bfc0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1bfd0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1bfe0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1bff0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1c000 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1c010 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1c020 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1c030 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1c040 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1c050 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1c060 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1c070 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1c080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1c090 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1c0a0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1c0b0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1c0c0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1c0d0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1c0e0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1c0f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1c100 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1c110 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1c120 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1c130 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1c140 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1c150 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1c160 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1c170 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c180 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1c190 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1c1a0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1c1b0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1c1c0 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1c1d0 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1c1e0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1c1f0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1c200 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1c210 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1c220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c230 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1c240 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1c250 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1c260 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
1c270 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1c280 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1c290 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1c2a0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1c2b0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1c2c0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1c2d0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1c2e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1c2f0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1c300 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1c310 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1c320 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1c330 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1c340 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1c350 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1c360 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1c370 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1c380 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1c390 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1c3a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1c3b0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1c3c0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1c3d0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1c3e0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1c3f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1c400 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1c410 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1c420 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1c430 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1c440 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1c450 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1c460 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1c470 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1c480 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1c490 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1c4a0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1c4b0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1c4c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1c4d0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1c4e0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1c4f0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1c500 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1c510 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1c520 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1c530 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1c540 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1c550 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1c560 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1c570 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1c580 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1c590 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1c5a0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1c5b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1c5c0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1c5d0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1c5e0 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1c5f0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1c600 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1c610 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c620 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1c630 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1c640 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1c650 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1c660 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1c670 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c680 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1c690 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c6a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1c6b0 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
1c6c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1c6d0 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
1c6e0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1c6f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1c700 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1c710 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1c720 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1c730 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1c740 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1c750 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1c760 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1c770 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1c780 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1c790 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1c7a0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1c7b0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1c7c0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1c7d0 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1c7e0 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1c7f0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1c800 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1c810 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1c820 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1c830 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1c840 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1c850 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1c860 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1c870 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1c880 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1c890 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1c8a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c8b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c8c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c8d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1c8e0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1c8f0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1c900 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1c910 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1c920 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1c930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1c940 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1c950 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1c960 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1c970 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1c980 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1c990 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1c9a0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1c9b0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1c9c0 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1c9d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1c9e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1c9f0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1ca00 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1ca10 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1ca20 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1ca30 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1ca40 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1ca50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1ca60 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1ca70 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1ca80 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1ca90 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1caa0 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1cab0 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1cac0 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1cad0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1cae0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1caf0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1cb00 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1cb10 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1cb20 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1cb30 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1cb40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cb50 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1cb60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1cb70 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1cb80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1cb90 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1cba0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1cbb0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1cbc0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1cbd0 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1cbe0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1cbf0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1cc00 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1cc10 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1cc20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1cc30 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1cc40 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1cc50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1cc60 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1cc70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cc80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cc90 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1cca0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1ccb0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
1ccc0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
1ccd0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
1cce0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1ccf0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1cd00 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1cd10 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1cd20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1cd30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1cd40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1cd50 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1cd60 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1cd70 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1cd80 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1cd90 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1cda0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1cdb0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1cdc0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1cdd0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1cde0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1cdf0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1ce00 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1ce10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ce20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ce30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ce40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1ce50 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1ce60 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1ce70 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1ce80 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1ce90 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1cea0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1ceb0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1cec0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1ced0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1cee0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1cef0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1cf00 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1cf10 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1cf20 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1cf30 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1cf40 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1cf50 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1cf60 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1cf70 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1cf80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1cf90 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1cfa0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1cfb0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1cfc0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1cfd0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1cfe0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1cff0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1d000 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1d010 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1d020 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1d030 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1d040 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1d050 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1d060 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1d070 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1d080 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1d090 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1d0a0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1d0b0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1d0c0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1d0d0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1d0e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d0f0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1d100 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1d110 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1d120 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1d130 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1d140 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1d150 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1d160 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1d170 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1d180 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1d190 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1d1a0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1d1b0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1d1c0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1d1d0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1d1e0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1d1f0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1d200 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d210 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1d220 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1d230 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1d240 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1d250 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1d260 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1d270 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1d280 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1d290 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1d2a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1d2b0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1d2c0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1d2d0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1d2e0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1d2f0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1d300 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1d310 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1d320 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1d330 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1d340 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1d350 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1d360 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1d370 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1d380 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1d390 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1d3a0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1d3b0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1d3c0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1d3d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d400 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1d410 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d430 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1d440 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1d450 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1d460 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d480 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1d490 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1d4a0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1d4b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1d4c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1d4d0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1d4e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1d4f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d510 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1d520 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1d530 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1d540 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d560 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1d570 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1d580 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1d590 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1d5a0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1d5b0 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1d5c0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1d5d0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1d5e0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1d5f0 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1d600 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1d610 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1d620 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1d630 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1d640 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1d650 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1d660 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1d670 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1d680 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1d690 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1d6a0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1d6b0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1d6c0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1d6d0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1d6e0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1d6f0 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1d700 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1d710 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1d720 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1d730 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1d740 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1d750 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1d760 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1d770 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1d780 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1d790 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1d7a0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1d7b0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1d7c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1d7d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1d7e0 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1d7f0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1d800 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1d810 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  g && (pBt->btsFl
1d820 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1d830 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  NLY)!=0) ){.    
1d840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1d850 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1d860 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
1d870 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1d880 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
1d890 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
1d8a0 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
1d8b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1d8c0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1d8d0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1d8e0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1d8f0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1d900 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1d910 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1d920 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1d930 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1d940 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1d950 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1d960 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1d970 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1d980 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1d990 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1d9a0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1d9b0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1d9c0 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1d9d0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1d9e0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1d9f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1da00 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1da10 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1da20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1da30 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1da40 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1da50 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1da60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1da70 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1da80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1da90 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dac0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1dad0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db00 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1db10 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1db20 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1db50 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1db60 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1db70 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1db80 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1db90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1dba0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1dbb0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1dbc0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1dbf0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1dc00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1dc10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dc20 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1dc30 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1dc40 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1dc50 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1dc60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1dc70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1dc80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1dc90 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1dca0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1dcb0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1dcc0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1dcd0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1dce0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1dcf0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1dd00 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1dd10 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1dd20 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1dd30 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1dd40 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1dd50 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1dd60 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1dd70 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1dd80 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1dd90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1dda0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ddb0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1ddc0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1ddd0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1dde0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1ddf0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1de00 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1de10 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1de20 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1de30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1de40 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1de50 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1de60 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1de70 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1de80 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1de90 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1dea0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1deb0 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1dec0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1ded0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1dee0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1def0 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1df00 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1df10 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1df20 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1df30 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1df40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1df50 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1df60 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1df70 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1df80 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1df90 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1dfa0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1dfb0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1dfc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1dfd0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1dfe0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1dff0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1e000 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1e010 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1e020 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1e030 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1e040 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1e050 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1e060 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1e070 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1e080 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1e090 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1e0a0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1e0b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1e0c0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1e0d0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1e0e0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1e0f0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1e100 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1e110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e120 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1e130 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1e140 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1e150 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1e160 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1e170 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1e180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1e190 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1e1a0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1e1b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1e1c0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1e1d0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1e1e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1e1f0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1e200 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1e210 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1e220 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1e230 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1e240 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1e250 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e270 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1e280 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1e290 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1e2a0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1e2b0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1e2c0 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1e2d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1e2e0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1e2f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1e300 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1e310 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1e320 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1e330 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1e340 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1e350 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1e360 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1e370 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e380 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1e390 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1e3a0 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1e3b0 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1e3c0 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1e3d0 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1e3e0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1e3f0 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1e400 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1e410 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1e420 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1e430 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1e440 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1e450 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1e460 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1e470 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1e480 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1e490 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1e4a0 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1e4b0 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1e4c0 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1e4d0 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1e4e0 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1e4f0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1e500 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1e510 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1e520 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1e530 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1e540 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1e550 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1e560 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1e570 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1e580 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1e590 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1e5a0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1e5b0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1e5c0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1e5d0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1e5e0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1e5f0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1e600 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1e610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
1e620 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
1e630 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
1e640 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
1e650 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
1e660 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
1e670 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
1e680 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
1e690 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
1e6a0 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1e6b0 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
1e6c0 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
1e6d0 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
1e6e0 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
1e6f0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
1e700 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e710 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1e720 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
1e730 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1e740 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1e750 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1e760 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1e770 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1e780 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1e790 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
1e7a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1e7b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e7c0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1e7d0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1e7e0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
1e7f0 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
1e800 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
1e810 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
1e820 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
1e830 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
1e840 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
1e850 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1e860 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1e8a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e8b0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
1e8f0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1e900 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1e940 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1e950 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1e960 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1e970 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1e980 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
1e990 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
1ea30 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1ea40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
1ea80 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
1ea90 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  */..#ifndef NDEB
1eaa0 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
1eab0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
1eac0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1ead0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1eae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1eaf0 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
1eb00 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
1eb10 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
1eb20 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
1eb30 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1eb40 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
1eb50 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
1eb60 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
1eb70 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
1eb80 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
1eb90 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
1eba0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1ebb0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1ebc0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1ebd0 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
1ebe0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
1ebf0 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
1ec00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ec10 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
1ec20 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  EBUG */../*.** S
1ec30 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1ec40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
1ec50 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
1ec60 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
1ec70 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
1ec80 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
1ec90 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1eca0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
1ecb0 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
1ecc0 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
1ecd0 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
1ece0 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
1ecf0 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
1ed00 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
1ed10 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1ed20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
1ed30 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
1ed40 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
1ed50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
1ed60 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f  ler must positio
1ed70 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69  n the cursor pri
1ed80 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1ed90 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
1eda0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1edb0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49   cannot fail.  I
1edc0 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
1edd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f   SQLITE_OK.  .*/
1ede0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1edf0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
1ee00 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
1ee10 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1ee20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ee30 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1ee40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1ee50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1ee60 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1ee70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1ee80 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1ee90 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
1eea0 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65  ID ){.    *pSize
1eeb0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1eec0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1eed0 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65  Cur);.    *pSize
1eee0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1eef0 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ey;.  }.  return
1ef00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ef10 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1ef20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1ef30 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
1ef40 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
1ef50 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
1ef60 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
1ef70 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1ef80 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
1ef90 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
1efa0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
1efb0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
1efc0 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
1efd0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
1efe0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
1eff0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
1f000 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
1f010 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
1f020 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f030 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65  D..**.** Failure
1f040 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1f050 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
1f060 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1f070 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74  SQLITE_OK..** It
1f080 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77   might just as w
1f090 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75  ell be a procedu
1f0a0 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f  re (returning vo
1f0b0 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69  id) but we conti
1f0c0 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e  nue.** to return
1f0d0 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75   an integer resu
1f0e0 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74  lt code for hist
1f0f0 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a  orical reasons..
1f100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f110 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
1f120 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1f130 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1f140 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f150 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f160 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f170 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f180 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
1f190 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
1f1a0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1f1b0 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  nData;.  return 
1f1c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f1d0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
1f1e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
1f1f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1f200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
1f210 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
1f220 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1f230 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
1f240 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1f250 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
1f260 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
1f270 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
1f280 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
1f290 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
1f2a0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
1f2b0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
1f2c0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
1f2d0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
1f2e0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
1f2f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
1f300 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
1f310 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1f320 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1f330 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
1f340 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1f350 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
1f360 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1f370 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
1f380 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
1f390 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
1f3a0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
1f3b0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
1f3c0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
1f3d0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
1f3e0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
1f3f0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
1f400 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
1f410 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
1f420 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
1f430 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
1f440 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
1f450 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
1f460 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
1f470 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1f480 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
1f490 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
1f4a0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1f4b0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
1f4c0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
1f4d0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
1f4e0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
1f4f0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
1f500 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
1f510 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
1f520 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1f530 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
1f540 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
1f550 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
1f560 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
1f570 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
1f580 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
1f590 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
1f5a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f5c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f5d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
1f600 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
1f610 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
1f620 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
1f630 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
1f640 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
1f650 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
1f660 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
1f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f680 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
1f690 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1f6a0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
1f6b0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1f6c0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
1f6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f6e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1f6f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1f700 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1f710 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
1f720 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1f730 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1f740 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
1f750 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
1f760 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1f770 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
1f780 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
1f790 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1f7a0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
1f7b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1f7c0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
1f7d0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
1f7e0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
1f7f0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
1f800 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
1f810 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
1f820 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
1f830 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
1f840 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
1f850 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
1f860 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
1f870 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
1f880 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1f890 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
1f8a0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
1f8b0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
1f8c0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
1f8d0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1f8e0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
1f8f0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
1f900 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f910 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
1f920 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
1f930 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
1f940 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f950 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
1f960 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1f970 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
1f980 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
1f990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f9a0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
1f9b0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
1f9c0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
1f9d0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
1f9e0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
1f9f0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1fa00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1fa10 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1fa20 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
1fa30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1fa40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fa50 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
1fa60 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1fa70 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
1fa80 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
1fa90 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
1faa0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
1fab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fac0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1fad0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1faf0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1fb00 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1fb10 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1fb20 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1fb30 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1fb40 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1fb50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1fb60 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1fb70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1fb80 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1fb90 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1fba0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1fbb0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1fbc0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1fbd0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1fbe0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1fbf0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1fc00 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1fc10 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1fc20 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1fc30 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1fc40 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1fc50 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1fc60 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1fc70 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1fc80 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1fc90 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1fca0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1fcb0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1fcc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1fcd0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1fce0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1fcf0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1fd00 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1fd10 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1fd20 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1fd30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1fd40 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1fd50 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1fd60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1fd70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1fd80 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1fd90 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1fda0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1fdb0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1fdc0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fde0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1fdf0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1fe00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fe10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1fe20 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1fe30 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1fe40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1fe50 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1fe60 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1fe70 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1fe80 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1fe90 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1fea0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1feb0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1fec0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1fed0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1fee0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1fef0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ff00 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1ff10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1ff20 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1ff30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ff40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ff50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1ff60 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1ff70 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1ff80 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1ff90 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1ffa0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1ffb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ffc0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1ffd0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1ffe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1fff0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20000 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20010 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
20020 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
20030 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
20040 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
20050 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
20060 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
20070 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
20080 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
20090 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
200a0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
200b0 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
200c0 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
200d0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
200e0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
200f0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
20100 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
20110 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
20120 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
20130 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
20140 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
20150 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
20160 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
20170 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
20180 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
20190 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
201a0 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
201b0 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
201c0 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
201d0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
201e0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
201f0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
20200 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
20210 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
20220 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
20230 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
20240 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
20250 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
20260 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
20270 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
20280 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
20290 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
202a0 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
202b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
202c0 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
202d0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
202e0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
202f0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
20300 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
20310 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
20320 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
20330 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
20340 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
20350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
20360 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
20370 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
20380 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
20390 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
203a0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
203b0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
203c0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
203d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
203e0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
203f0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
20400 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
20410 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
20420 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
20430 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
20440 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
20450 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
20460 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
20470 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
20480 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
20490 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
204a0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
204b0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
204c0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
204d0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
204e0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
204f0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
20500 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
20510 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
20520 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
20530 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
20540 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
20550 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
20560 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
20570 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
20580 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
20590 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
205a0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
205b0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
205c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
205d0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
205e0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
205f0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
20600 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
20610 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
20620 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
20630 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
20640 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
20650 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
20660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20670 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
20680 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
20690 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
206a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
206b0 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
206c0 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
206d0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
206e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
206f0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
20700 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
20710 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
20720 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
20730 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
20740 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20750 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20760 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
20770 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20780 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
20790 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
207a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
207b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
207c0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
207d0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
207e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
207f0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
20800 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
20810 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
20820 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
20830 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
20840 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
20850 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
20860 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
20870 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
20880 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20890 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
208a0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
208b0 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
208c0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
208d0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
208e0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
208f0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
20900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20910 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20920 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
20930 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
20940 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
20950 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
20960 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
20970 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
20980 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
20990 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
209a0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
209b0 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
209c0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
209d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
209e0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
209f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
20a00 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
20a10 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
20a20 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
20a30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
20a40 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
20a50 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
20a60 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
20a70 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
20a80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
20a90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
20aa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
20ab0 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
20ac0 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
20ad0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
20ae0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
20af0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
20b00 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
20b10 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
20b20 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
20b30 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
20b40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
20b50 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
20b60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
20b70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
20b80 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
20b90 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
20ba0 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
20bb0 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
20bc0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
20bd0 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
20be0 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
20bf0 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
20c00 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
20c10 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
20c20 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
20c30 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
20c40 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
20c50 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
20c60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
20c70 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
20c80 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
20c90 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
20ca0 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
20cb0 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
20cc0 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
20cd0 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
20ce0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
20cf0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
20d00 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
20d10 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
20d20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
20d30 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
20d40 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
20d50 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
20d60 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
20d70 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
20d80 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
20d90 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
20da0 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
20db0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
20dc0 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
20dd0 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
20de0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
20df0 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
20e00 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
20e10 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
20e20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
20e30 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
20e40 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
20e50 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
20e60 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
20e70 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
20e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20e90 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
20ea0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
20eb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
20ec0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
20ed0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
20ee0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
20ef0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
20f00 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
20f10 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
20f20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
20f30 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
20f40 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
20f50 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
20f60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
20f70 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
20f80 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
20f90 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
20fa0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
20fb0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20fc0 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
20fd0 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
20fe0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
20ff0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
21000 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
21010 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
21020 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
21030 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
21040 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
21050 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
21060 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
21070 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
21080 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
21090 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
210a0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
210b0 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
210c0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
210d0 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
210e0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
210f0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
21100 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21110 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
21120 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
21130 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
21140 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
21150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
21160 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
21170 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
21180 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
21190 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
211a0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
211b0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
211c0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
211d0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
211e0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
211f0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
21200 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
21210 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
21220 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
21230 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
21240 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
21250 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
21260 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
21270 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
21280 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
21290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
212a0 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
212b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
212c0 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
212d0 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
212e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
212f0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
21300 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
21310 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
21320 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
21330 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
21340 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
21350 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
21360 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
21370 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
21380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21390 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
213a0 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
213b0 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
213c0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
213d0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
213e0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
213f0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
21400 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
21410 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
21420 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
21430 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
21440 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
21450 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
21460 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
21470 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
21480 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
21490 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
214a0 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
214b0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
214c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
214d0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
214e0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
214f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
21500 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
21510 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
21520 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21530 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
21540 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
21550 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
21560 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
21570 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
21580 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
21590 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
215a0 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
215b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
215c0 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
215d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
215e0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
215f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
21600 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
21610 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
21620 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
21630 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
21640 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
21650 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
21660 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
21670 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21680 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
21690 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
216a0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
216b0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
216c0 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
216d0 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
216e0 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
216f0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
21700 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
21710 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
21720 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
21730 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
21770 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
21780 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
217c0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
217d0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
217e0 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
217f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
21800 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
21810 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
21820 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
21830 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
21840 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
21850 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
21860 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
21870 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21890 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (5) */.        )
218a0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
218b0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
218c0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
218d0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
218e0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
218f0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
21900 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21910 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
21920 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
21930 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
21940 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
21950 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
21960 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
21970 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
21980 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
21990 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
219a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
219b0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
219c0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
219d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
219e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
219f0 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
21a00 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
21a10 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
21a20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f         (eOp==0 ?
21a30 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
21a40 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20  NLY : 0).       
21a50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
21a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21a70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21a80 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
21a90 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
21aa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21ab0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21ac0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
21ad0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
21ae0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
21af0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
21b00 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
21b10 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
21b20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21b30 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
21b40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
21b50 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
21b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
21b80 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
21b90 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
21ba0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
21bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21bc0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
21bd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21be0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21c00 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
21c10 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
21c20 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
21c30 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
21c40 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
21c50 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
21c60 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
21c70 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
21c80 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
21c90 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
21ca0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
21cb0 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
21cc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
21cd0 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
21ce0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
21cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21d00 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
21d10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
21d20 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
21d30 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
21d40 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
21d50 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
21d60 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
21d70 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
21d80 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
21d90 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
21da0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
21db0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
21dc0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
21dd0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21de0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21e00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21e10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21e20 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21e30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
21e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21e60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21e70 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
21e80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21e90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
21ea0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
21eb0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
21ec0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
21ed0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
21ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
21ef0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
21f00 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
21f10 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
21f20 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
21f30 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
21f40 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
21f50 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
21f60 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
21f70 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
21f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21f90 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
21fa0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
21fb0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21fc0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21fd0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
21fe0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
21ff0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
22000 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
22010 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
22020 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
22030 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
22040 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
22050 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
22060 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
22070 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
22080 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
22090 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
220a0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
220b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
220c0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
220d0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
220e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
220f0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
22100 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
22110 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
22120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22130 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
22140 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22150 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
22160 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
22170 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
22180 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22190 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
221a0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
221b0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
221c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
221d0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
221e0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
221f0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
22200 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
22210 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
22220 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22230 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22240 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
22250 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
22260 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
22270 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
22280 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
22290 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
222a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
222b0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
222c0 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
222d0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
222e0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
222f0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
22300 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
22310 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
22320 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
22330 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
22340 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
22350 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
22360 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
22370 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
22380 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
22390 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
223a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
223b0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
223c0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
223d0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
223e0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
223f0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
22400 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
22410 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
22420 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
22430 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
22440 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
22450 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
22460 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
22470 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
22480 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
22490 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
224a0 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
224b0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
224c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
224d0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
224e0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
224f0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
22500 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
22510 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
22520 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
22530 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
22540 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
22550 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
22560 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
22570 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
22580 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
22590 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
225a0 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
225b0 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
225c0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
225d0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
225e0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
225f0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
22600 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
22610 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
22620 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
22630 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
22640 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
22650 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
22660 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22680 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
22690 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
226a0 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
226b0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
226c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
226d0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
226e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
226f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22710 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22720 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
22730 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
22740 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22750 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22760 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22770 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22780 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22790 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
227a0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ell );.  if( pCu
227b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
227c0 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
227d0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
227e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
227f0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
22800 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22820 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
22830 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d  .  *pAmt = pCur-
22840 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
22850 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 28 70  return (void*)(p
22860 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
22870 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
22880 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ader);.}.../*.**
22890 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
228a0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
228b0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
228c0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
228d0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
228e0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
228f0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
22900 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
22910 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
22920 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
22930 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
22940 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
22950 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22960 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
22970 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
22980 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
22990 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
229a0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
229b0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
229c0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
229d0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
229e0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
229f0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
22a00 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
22a10 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
22a20 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
22a30 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
22a40 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
22a50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
22a60 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
22a70 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
22a80 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
22a90 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
22aa0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
22ab0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
22ac0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
22ad0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
22ae0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
22af0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22b00 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
22b10 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
22b20 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
22b30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
22b40 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
22b50 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
22b60 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
22b70 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
22b80 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
22b90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
22ba0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
22bb0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
22bc0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
22bd0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
22be0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
22bf0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
22c00 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
22c10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22c20 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
22c30 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
22c40 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
22c50 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
22c60 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
22c70 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
22c80 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
22c90 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
22ca0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
22cb0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
22cc0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
22cd0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
22ce0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
22cf0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
22d00 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
22d10 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
22d20 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
22d30 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
22d40 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
22d50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
22d60 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
22d70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
22d80 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
22d90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22da0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22db0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22dc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22de0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
22df0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
22e00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22e10 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
22e20 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
22e30 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
22e40 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
22e50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22e60 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
22e70 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
22e80 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
22e90 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20   &pNewPage,.    
22ea0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
22eb0 3e 77 72 46 6c 61 67 3d 3d 30 20 3f 20 50 41 47  >wrFlag==0 ? PAG
22ec0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
22ed0 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
22ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
22ef0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
22f00 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
22f10 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
22f20 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
22f30 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
22f40 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22f50 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22f60 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
22f70 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
22f80 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
22f90 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
22fa0 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
22fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22fc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22fd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22fe0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  _OK;.}..#if 0./*
22ff0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
23000 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
23010 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
23020 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
23030 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
23040 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
23050 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
23060 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
23070 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
23080 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
23090 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
230a0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
230b0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
230c0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
230d0 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
230e0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
230f0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
23100 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
23110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
23120 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
23130 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
23140 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
23150 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
23160 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
23170 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
23180 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
23190 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
231a0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
231b0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
231c0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
231d0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
231e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
231f0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
23200 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
23210 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
23220 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
23230 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
23240 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
23250 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
23260 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23270 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
23280 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
23290 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
232a0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
232b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
232c0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
232d0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
232e0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
232f0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
23300 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
23310 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
23320 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
23330 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
23340 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
23350 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
23360 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
23370 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
23380 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23390 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
233a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
233b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
233c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
233d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
233e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
233f0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
23400 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23410 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20  ur->iPage] );.. 
23420 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69   /* UPDATE: It i
23430 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69  s actually possi
23440 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64  ble for the cond
23450 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20  ition tested by 
23460 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20  the assert.  ** 
23470 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72  below to be untr
23480 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
23490 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
234a0 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63  pt. This can occ
234b0 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63  ur if.  ** one c
234c0 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69  ursor has modifi
234d0 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20  ed page pParent 
234e0 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63  while a referenc
234f0 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20  e to it is held 
23500 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e  .  ** by a secon
23510 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20  d cursor. Which 
23520 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
23530 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
23540 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20   is linked.  ** 
23550 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
23560 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
23570 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74  ure in a corrupt
23580 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23   database.  */.#
23590 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72  if 0.  assertPar
235a0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
235b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
235c0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
235d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
235e0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
235f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23600 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
23610 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74  .  );.#endif.  t
23620 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
23630 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23640 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
23650 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
23660 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
23670 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
23680 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23690 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
236a0 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
236b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
236c0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
236d0 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
236e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
236f0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
23700 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
23710 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
23720 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
23730 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
23740 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
23750 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
23760 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
23770 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
23780 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
23790 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
237a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
237b0 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
237c0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
237d0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
237e0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
237f0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
23800 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
23810 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
23820 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
23830 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
23840 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
23850 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
23860 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
23870 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
23880 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
23890 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
238a0 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
238b0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
238c0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
238d0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
238e0 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
238f0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
23900 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
23910 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
23920 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
23930 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
23940 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
23950 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
23960 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
23970 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
23980 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
23990 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
239a0 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
239b0 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
239c0 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
239d0 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
239e0 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
239f0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
23a00 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
23a10 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
23a20 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
23a30 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
23a40 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
23a50 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
23a60 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
23a70 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
23a80 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
23a90 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
23aa0 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
23ab0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
23ac0 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
23ad0 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
23ae0 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
23af0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
23b00 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
23b10 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
23b20 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
23b30 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
23b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
23b50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23b60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
23b80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
23b90 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
23ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
23bb0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
23bc0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
23bd0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
23be0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
23bf0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
23c00 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
23c10 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
23c20 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
23c30 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
23c40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
23c50 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
23c60 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
23c70 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
23c80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
23c90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
23ca0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
23cb0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
23cc0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
23cd0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23ce0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
23cf0 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c  Cur->iPage ) rel
23d00 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
23d10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23d20 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  e--]);.  }else i
23d30 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
23d40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
23d50 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23d60 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
23d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
23d90 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
23da0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
23db0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
23dc0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
23dd0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23df0 43 75 72 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 3f  Cur->wrFlag==0 ?
23e00 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
23e10 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  NLY : 0);.    if
23e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23e30 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
23e40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
23e50 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
23e60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
23e70 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
23e80 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20   0;.  }.  pRoot 
23e90 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
23ea0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
23eb0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
23ec0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
23ed0 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
23ee0 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
23ef0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
23f00 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
23f10 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
23f20 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
23f30 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
23f40 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
23f50 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
23f60 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
23f70 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
23f80 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
23f90 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
23fa0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
23fb0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
23fc0 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
23fd0 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
23fe0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
23ff0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
24000 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
24010 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
24020 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
24030 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
24040 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
24050 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
24060 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
24070 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
24080 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
24090 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
240a0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
240b0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
240c0 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
240d0 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
240e0 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
240f0 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
24100 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
24110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
24120 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
24130 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
24140 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
24150 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
24160 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
24170 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
24180 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
24190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
241a0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
241b0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
241c0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
241d0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
241e0 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
241f0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24200 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
24210 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
24220 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
24230 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
24240 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
24250 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
24260 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
24270 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
24280 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
24290 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
242a0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
242b0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
242c0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
242d0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
242e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
242f0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
24300 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24310 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
24320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24330 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
24340 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
24350 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24360 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
24370 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
24380 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
24390 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
243a0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
243b0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
243c0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
243d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
243e0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
243f0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
24400 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
24410 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
24420 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
24430 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
24440 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
24450 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
24460 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
24470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24480 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
24490 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
244a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
244b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
244c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
244d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
244e0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
244f0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
24500 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24510 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
24520 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
24530 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
24540 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
24550 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
24560 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
24570 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
24580 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24590 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
245a0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
245b0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
245c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
245d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
245e0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
245f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
24600 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
24610 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
24620 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
24630 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
24640 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
24650 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
24660 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
24670 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
24680 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
24690 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
246a0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
246b0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
246c0 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
246d0 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
246e0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
246f0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
24700 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
24710 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
24720 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24730 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
24740 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
24750 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
24760 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
24770 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
24780 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
24790 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
247a0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
247b0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
247c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
247d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
247e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
247f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24800 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24810 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24820 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24830 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
24840 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
24850 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24860 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
24870 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
24880 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
24890 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
248a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
248b0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
248c0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
248d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
248e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
248f0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
24900 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
24910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
24920 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24930 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
24940 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
24950 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24960 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
24970 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
24980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24990 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
249a0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
249b0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
249c0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
249d0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
249e0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
249f0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
24a00 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
24a10 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
24a20 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
24a30 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
24a40 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
24a50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
24a60 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
24a70 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
24a80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
24a90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24aa0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24ab0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24ac0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
24ad0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
24ae0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
24af0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
24b00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
24b20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24b30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
24b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
24b50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
24b60 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
24b70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24b80 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
24b90 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
24ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
24bb0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24bc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24bd0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
24be0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
24bf0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
24c00 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
24c10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24c20 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
24c30 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
24c40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
24c50 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
24c60 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
24c70 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
24c80 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
24c90 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
24ca0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
24cb0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
24cc0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
24cd0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
24ce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24cf0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
24d00 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
24d10 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
24d20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
24d30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
24d40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
24d50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24d60 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
24d70 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
24d80 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
24d90 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
24da0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
24db0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
24dc0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
24dd0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
24de0 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
24df0 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
24e00 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24e10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
24e20 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
24e30 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
24e40 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
24e50 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
24e60 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24e70 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
24e80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
24e90 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
24ea0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
24eb0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
24ec0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
24ed0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
24ee0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
24ef0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24f00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24f10 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
24f20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24f30 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
24f40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24f50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24f60 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
24f70 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
24f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24f90 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
24fa0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
24fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24fc0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
24fd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24fe0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
24ff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25000 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25010 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25020 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
25030 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25040 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
25050 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25060 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25070 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
25080 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25090 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
250a0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
250b0 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
250c0 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
250d0 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d   ?1:0;.    }.  }
250e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
250f0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
25100 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
25110 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
25120 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
25130 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
25140 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
25150 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
25160 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
25170 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
25180 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
25190 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
251a0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
251b0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
251c0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
251d0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
251e0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
251f0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
25200 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
25210 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
25220 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
25230 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
25240 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25250 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
25260 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
25270 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
25280 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
25290 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
252a0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
252b0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
252c0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
252d0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
252e0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
252f0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
25300 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
25310 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
25320 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
25330 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
25340 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
25350 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
25360 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
25370 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
25380 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
25390 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
253a0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
253b0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
253c0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
253d0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
253e0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
253f0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
25400 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25410 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
25420 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
25430 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25440 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
25450 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
25460 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
25470 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
25480 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
25490 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
254a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
254b0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
254d0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
254e0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
254f0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
25500 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
25510 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
25520 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
25530 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
25540 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
25550 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
25560 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
25570 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
25580 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
25590 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
255a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
255b0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
255c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
255d0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
255e0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
255f0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
25600 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
25610 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
25620 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
25630 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
25640 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
25650 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
25660 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
25670 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
25680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
25690 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
256a0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
256b0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
256c0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
256d0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
256e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
256f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25710 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
25720 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
25730 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25740 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
25750 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
25760 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
25770 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
25780 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
25790 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
257a0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
257b0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
257c0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
257d0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
257e0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
257f0 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
25800 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25810 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
25820 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
25830 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
25840 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
25850 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
25860 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
25870 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
25880 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
25890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
258a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
258b0 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
258c0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
258d0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
258e0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
258f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25900 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
25910 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
25920 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
25930 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
25940 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
25950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
25960 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
25970 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
25980 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
25990 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
259a0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
259b0 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
259c0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d    );.  }..  rc =
259d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
259e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
259f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25a00 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
25a10 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25a20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25a30 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25a40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25a50 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25a60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25a70 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
25a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25a90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25aa0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
25ab0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25ac0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
25ad0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
25ae0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
25af0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
25b00 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
25b10 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25b20 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25b30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25b40 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
25b50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25b60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
25b70 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
25b80 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
25b90 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
25ba0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
25bb0 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
25bc0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
25bd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
25be0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
25bf0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
25c00 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
25c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
25c30 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
25c40 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
25c50 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
25c60 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
25c70 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
25c80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
25c90 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
25ca0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
25cb0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
25cc0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
25cd0 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
25ce0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
25cf0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
25d00 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
25d10 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
25d20 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
25d30 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
25d40 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
25d50 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
25d60 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
25d70 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
25d80 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
25d90 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
25da0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
25db0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
25dc0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
25dd0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
25de0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
25df0 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
25e00 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
25e10 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
25e20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
25e30 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
25e40 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
25e50 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
25e60 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
25e70 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
25e80 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
25e90 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
25ea0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
25eb0 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
25ec0 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
25ed0 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
25ee0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
25ef0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25f00 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
25f10 69 64 78 3b 0a 20 20 20 20 69 66 28 20 70 50 61  idx;.    if( pPa
25f20 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
25f30 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
25f40 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
25f50 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  y;.        pCell
25f60 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
25f70 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
25f80 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
25f90 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
25fa0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
25fb0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
25fc0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
25fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25fe0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
25ff0 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
26000 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26010 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
26020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
26030 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
26040 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
26050 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
26060 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
26070 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
26080 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
26090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
260a0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
260b0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
260c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
260d0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
260e0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
260f0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
26100 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
26110 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
26120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26130 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26140 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
26150 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
26160 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
26170 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   1;.          pC
26180 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
26190 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
261a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
261b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
261c0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
261d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
261e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
261f0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
26200 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
26210 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
26220 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26230 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
26240 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
26250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26260 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
26270 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26280 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
26290 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
262a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
262b0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
262c0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
262d0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
262e0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
262f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26300 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
26310 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
26320 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
26330 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
26340 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
26350 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
26360 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
26370 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
26380 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
26390 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
263a0 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
263b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
263c0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
263d0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
263e0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
263f0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
26400 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
26410 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
26420 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
26430 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
26440 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
26450 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
26460 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
26470 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
26480 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
26490 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
264a0 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
264b0 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
264c0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
264d0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
264e0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
264f0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
26500 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
26510 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
26520 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
26530 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
26540 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
26550 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
26560 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
26570 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
26580 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
26590 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
265a0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
265b0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
265c0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
265d0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
265e0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
265f0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
26600 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
26610 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
26620 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
26630 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
26640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26650 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
26660 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
26670 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
26680 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
26690 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
266a0 6c 6c 5b 31 5d 2c 20 70 43 65 6c 6c 5b 31 5d 2c  ll[1], pCell[1],
266b0 20 31 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20   1, pIdxKey);.  
266c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
266d0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
266e0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
266f0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
26700 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
26710 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
26720 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
26730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26740 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
26750 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
26760 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
26770 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
26780 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
26790 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
267a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
267b0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
267c0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
267d0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
267e0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
267f0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
26800 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
26810 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 43  d*)&pCell[2], pC
26820 65 6c 6c 5b 32 5d 2c 20 31 2c 20 70 49 64 78 4b  ell[2], 1, pIdxK
26830 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
26840 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26850 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
26860 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
26870 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
26880 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
26890 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
268a0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
268b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
268c0 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
268d0 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
268e0 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
268f0 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
26900 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
26910 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
26920 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
26930 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
26940 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
26950 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   be called. */. 
26960 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
26970 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26980 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
26990 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
269a0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
269b0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
269c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
269d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
269e0 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
269f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
26a00 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
26a10 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
26a20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
26a30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
26a40 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
26a50 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
26a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26a80 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
26a90 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26aa0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26ab0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26ac0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26ad0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
26ae0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
26af0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
26b00 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
26b10 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
26b20 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
26b30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26b40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26b50 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
26b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
26b70 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
26b80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26b90 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
26ba0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26bb0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 28 28 75 38  , pCellKey, ((u8
26bc0 2a 29 70 43 65 6c 6c 4b 65 79 29 5b 30 5d 2c 20  *)pCellKey)[0], 
26bd0 31 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  1, pIdxKey);.   
26be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26bf0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
26c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26c10 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
26c20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26c30 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
26c40 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
26c50 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
26c60 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
26c70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
26c80 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
26c90 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
26ca0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26cc0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
26cd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
26ce0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
26cf0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
26d00 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
26d10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77  }.        if( lw
26d20 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20  r>upr ) break;. 
26d30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
26d40 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
26d50 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
26d60 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
26d70 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a   = (lwr+upr)/2 *
26d80 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
26d90 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
26da0 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65  =upr+1 || (pPage
26db0 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
26dc0 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20  ge->leaf) );.   
26dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26de0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
26df0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
26e00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26e10 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26e20 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
26e30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26e40 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
26e50 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
26e60 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
26e70 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
26e80 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
26e90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26ea0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
26eb0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
26ec0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
26ed0 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
26ee0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
26ef0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
26f00 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
26f10 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
26f20 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
26f30 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
26f40 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
26f50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
26f60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
26f70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26f80 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
26f90 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
26fa0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
26fb0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
26fc0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
26fd0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
26fe0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26ff0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
27000 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 72  lidNKey = 0;.  r
27010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27020 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
27030 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
27040 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
27050 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
27060 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
27070 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
27080 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
27090 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
270a0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
270b0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
270c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
270d0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
270e0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
270f0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
27100 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
27110 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
27120 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
27130 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27140 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
27150 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
27160 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
27170 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
27180 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27190 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
271a0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
271b0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
271c0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
271d0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
271e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
271f0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
27200 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
27210 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
27220 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
27230 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
27240 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
27250 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
27260 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
27270 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
27280 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27290 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
272a0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
272b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
272c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
272d0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
272e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
272f0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
27300 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
27310 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
27320 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
27330 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
27340 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
27350 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
27360 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
27370 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
27380 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
27390 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
273a0 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
273b0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
273c0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
273d0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
273e0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
273f0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
27400 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
27410 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
27420 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
27430 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
27440 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
27450 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
27460 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
27470 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
27480 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
27490 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
274a0 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
274b0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
274c0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
274d0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
274e0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
274f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27500 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
27510 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
27520 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
27530 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
27540 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
27550 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ver.).*/.int sql
27560 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
27570 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
27580 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
27590 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
275a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
275b0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
275c0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
275d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
275e0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
275f0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
27600 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
27610 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
27620 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
27630 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
27640 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
27650 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
27660 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
27670 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
27680 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
27690 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
276a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
276b0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
276c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
276d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
276e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
276f0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
27700 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27720 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
27730 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
27740 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
27750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
27770 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
27780 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
27790 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
277a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
277b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
277c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
277d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
277e0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
277f0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
27800 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
27810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
27820 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
27830 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
27840 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
27850 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27860 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27870 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
27880 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27890 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
278a0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
278b0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
278c0 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
278d0 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
278e0 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
278f0 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
27900 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
27910 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
27920 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
27930 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
27940 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
27950 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
27960 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
27970 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
27980 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
27990 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
279a0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
279b0 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
279c0 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
279d0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
279e0 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
279f0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
27a00 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
27a10 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
27a20 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
27a30 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
27a40 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
27a50 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
27a60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
27a70 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
27a80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
27a90 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
27aa0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
27ab0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
27ac0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
27ad0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
27ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
27af0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
27b00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27b10 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  }.      rc = mov
27b20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
27b30 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
27b40 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
27b50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
27b60 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
27b70 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
27b80 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
27b90 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
27ba0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
27bb0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
27bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27bd0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
27be0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
27bf0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
27c00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27c10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27c20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
27c30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27c40 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
27c50 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
27c60 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
27c70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
27c80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
27c90 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
27ca0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
27cb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27cc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
27cd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27ce0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
27cf0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
27d00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27d10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
27d20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
27d30 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
27d40 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
27d50 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
27d60 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
27d70 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
27d80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27d90 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
27da0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
27db0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
27dc0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
27dd0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
27de0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
27df0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
27e00 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
27e10 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
27e20 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
27e30 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  s=1..**.** The c
27e40 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
27e50 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
27e60 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
27e70 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
27e80 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
27e90 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
27ea0 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
27eb0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
27ec0 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
27ed0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
27ee0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
27ef0 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
27f00 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
27f10 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
27f20 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
27f30 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
27f40 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
27f50 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
27f60 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
27f70 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
27f80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
27f90 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
27fa0 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
27fb0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
27fc0 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
27fd0 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
27fe0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
27ff0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
28000 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
28010 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
28020 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
28030 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28040 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
28050 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
28060 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28070 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
28080 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
28090 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
280a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
280b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
280c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
280d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
280e0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
280f0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
28100 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
28110 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
28120 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
28130 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
28140 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
28150 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
28160 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28170 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
28180 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  ){.    if( ALWAY
28190 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  S(pCur->eState>=
281a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
281b0 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EK) ){.      rc 
281c0 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  = btreeRestoreCu
281d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
281e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
281f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28200 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
28210 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28220 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28230 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
28240 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
28250 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
28260 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
28270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28280 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
28290 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
282a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
282b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
282c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
282d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
282e0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
282f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
28300 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
28310 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
28320 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
28330 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
28340 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
28350 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28360 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28380 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
28390 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
283a0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
283b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
283c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
283d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
283e0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
283f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28400 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
28410 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28420 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
28430 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28440 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
28450 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
28460 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28470 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
284a0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
284b0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
284c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
284d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
284e0 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
284f0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
28500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
28510 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28520 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28530 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
28540 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28560 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
28570 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
28580 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
28590 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
285a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
285b0 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
285c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
285d0 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
285e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
285f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28600 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
28610 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
28620 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
28630 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
28640 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
28650 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
28660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28670 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
28680 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
28690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
286a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
286b0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
286c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
286d0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
286e0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
286f0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
28700 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
28710 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
28720 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
28730 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
28740 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
28750 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
28760 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
28770 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
28780 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
28790 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
287a0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
287b0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
287c0 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
287d0 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
287e0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
287f0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
28800 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
28810 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
28820 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
28830 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
28840 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
28850 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
28860 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
28870 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
28880 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28890 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
288a0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
288b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
288c0 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
288d0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
288e0 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
288f0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
28900 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
28910 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
28920 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
28930 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
28940 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
28950 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
28960 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
28970 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
28980 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28990 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
289a0 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
289b0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
289c0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
289d0 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
289e0 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
289f0 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
28a00 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
28a10 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
28a20 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
28a30 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
28a40 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
28a50 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
28a60 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
28a70 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
28a80 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
28a90 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
28aa0 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
28ab0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
28ac0 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
28ad0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
28ae0 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
28af0 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
28b00 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
28b10 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
28b20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
28b30 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
28b40 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
28b50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
28b60 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
28b70 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
28b80 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
28b90 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
28ba0 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
28bb0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
28bc0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
28bd0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28be0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
28bf0 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
28c00 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
28c10 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
28c20 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
28c30 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
28c40 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
28c50 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
28c60 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
28c70 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
28c80 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
28c90 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
28ca0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
28cb0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
28cc0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
28cd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
28ce0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
28cf0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
28d00 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
28d10 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
28d20 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
28d30 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
28d40 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
28d50 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
28d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28d70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28d80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
28d90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
28da0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
28db0 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
28dc0 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
28dd0 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
28de0 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
28df0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
28e00 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
28e10 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
28e20 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
28e30 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
28e40 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
28e50 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
28e60 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
28e70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
28e80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28e90 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
28ea0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
28eb0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
28ec0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
28ed0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
28ee0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
28ef0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
28f00 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
28f10 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
28f20 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
28f30 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
28f40 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
28f50 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
28f60 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
28f70 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
28f80 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
28f90 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
28fa0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
28fb0 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
28fc0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
28fd0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
28fe0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
28ff0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
29000 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
29010 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29020 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
29030 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
29040 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
29050 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
29060 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
29070 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
29080 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
29090 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
290a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
290b0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
290c0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
290d0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
290e0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
290f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
29100 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29110 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
29120 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
29130 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
29140 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
29150 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29160 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
29170 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
29180 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
29190 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
291a0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
291b0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
291c0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
291d0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
291e0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
291f0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
29200 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
29210 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
29220 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
29230 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
29240 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29250 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
29260 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29270 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
29280 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29290 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
292a0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
292b0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
292c0 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
292d0 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
292e0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
292f0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
29300 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
29310 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
29320 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
29330 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
29340 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
29350 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
29360 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
29370 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
29380 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
29390 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
293a0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
293b0 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
293c0 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
293d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
293e0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
293f0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
29400 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
29410 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
29420 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
29430 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
29440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29450 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29460 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29470 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
29480 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
29490 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
294a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
294b0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
294c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
294d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
294e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
294f0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
29500 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
29510 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
29520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29530 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29540 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
29550 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29560 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29570 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29580 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
29590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
295a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
295b0 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
295c0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
295d0 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
295e0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
295f0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
29600 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
29610 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
29620 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
29630 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
29640 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
29650 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
29660 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
29670 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
29680 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
29690 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
296a0 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
296b0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
296c0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
296d0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
296e0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
296f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29700 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
29710 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
29720 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
29740 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29760 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
29770 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
29780 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29790 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
297a0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
297b0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
297c0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
297d0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
297e0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
297f0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
29800 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
29810 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
29820 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
29830 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
29840 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
29850 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
29860 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
29870 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
29880 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29890 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
298a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
298b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
298c0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
298d0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
298e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
298f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
29900 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
29910 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
29920 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
29930 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
29940 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
29950 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
29960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
29970 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
29980 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
29990 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
299a0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
299b0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
299c0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
299d0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
299e0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
299f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
29a00 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
29a10 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29a20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29a30 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
29a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29a50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29a60 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
29a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
29a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29a90 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29aa0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
29ab0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
29ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
29ad0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29af0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29b00 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29b10 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29b30 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29b40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29b50 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
29b60 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29b90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29ba0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29bb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29bc0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29bd0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
29be0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
29bf0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
29c30 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
29c40 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
29c50 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
29c60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
29c70 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
29c80 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
29c90 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
29ca0 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
29cb0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
29cc0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
29cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
29ce0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
29cf0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
29d00 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
29d10 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
29d20 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
29d30 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
29d40 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
29d50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29d60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29d70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
29d80 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29d90 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
29da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29db0 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
29dc0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
29dd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
29de0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29df0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
29e00 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
29e10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29e30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29e40 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29e60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29e70 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
29e80 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
29e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29eb0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
29ec0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
29ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
29ee0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29ef0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
29f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
29f10 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
29f20 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
29f30 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
29f40 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
29f50 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
29f60 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
29f70 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
29f80 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
29f90 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
29fa0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
29fb0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
29fc0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
29fd0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
29fe0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
29ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a000 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2a010 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a020 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2a030 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2a040 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a050 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
2a060 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2a070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a090 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2a0a0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2a0b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a0c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2a0d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a0e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a0f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a100 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a110 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2a120 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
2a130 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2a140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a150 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2a160 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2a170 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2a180 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2a190 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2a1a0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
2a1b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a1c0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
2a1d0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
2a1e0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
2a1f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
2a200 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
2a210 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
2a220 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
2a230 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
2a240 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
2a250 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
2a260 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
2a270 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
2a280 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2a290 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
2a2a0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2a2b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2a2c0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
2a2e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2a2f0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
2a300 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a310 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a330 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2a350 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2a360 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a370 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
2a380 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
2a390 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
2a3a0 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
2a3b0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
2a3c0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
2a3d0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2a3e0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2a3f0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
2a400 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
2a410 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2a420 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2a430 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
2a440 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
2a450 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
2a460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a470 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2a490 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
2a4a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a4c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2a4d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
2a4e0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2a4f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
2a500 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2a510 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
2a520 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
2a530 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2a540 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2a550 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
2a560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2a570 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a580 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2a590 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2a5a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a5b0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2a5c0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2a5d0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2a5e0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
2a5f0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
2a600 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
2a610 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
2a620 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2a630 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
2a640 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
2a650 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
2a660 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
2a670 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
2a680 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2a690 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
2a6a0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
2a6d0 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
2a6e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
2a6f0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
2a700 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
2a710 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
2a720 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a730 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2a740 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2a750 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2a760 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a770 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
2a780 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
2a790 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2a7a0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
2a7b0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
2a7c0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
2a7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a7e0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
2a7f0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
2a800 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
2a810 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
2a820 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
2a830 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  o) ? PAGER_GET_N
2a840 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2a850 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2a860 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2a870 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2a880 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2a890 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a8b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a8c0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2a8d0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2a8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a8f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a910 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2a920 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2a930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2a940 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2a950 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2a960 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a970 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2a980 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2a990 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2a9a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2a9b0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2a9c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2a9d0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2a9e0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2a9f0 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2aa00 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2aa10 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2aa20 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2aa30 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2aa40 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2aa50 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2aa60 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2aa70 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2aa80 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2aa90 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2aaa0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2aab0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2aac0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2aad0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2aae0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2aaf0 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2ab00 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2ab10 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2ab20 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2ab30 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2ab40 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2ab50 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2ab60 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2ab70 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2ab80 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2ab90 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2aba0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2abb0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2abc0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2abd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2abe0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2abf0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2ac00 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2ac10 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2ac20 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2ac30 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2ac40 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2ac50 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2ac60 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2ac70 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2ac80 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2ac90 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2aca0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2acb0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2acc0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2acd0 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2ace0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2acf0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2ad00 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2ad10 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2ad20 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2ad30 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2ad40 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2ad50 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2ad60 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2ad70 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2ad80 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2ad90 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2ada0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2adb0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2adc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2add0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2ade0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2adf0 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2ae00 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2ae10 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   ? PAGER_GET_NOC
2ae20 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20  ONTENT : 0;..   
2ae30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ae40 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2ae50 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2ae60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ae70 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2ae80 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2ae90 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2aea0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2aeb0 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2aec0 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2aed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2aee0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2aef0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2af00 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2af10 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2af20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2af30 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2af40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2af50 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2af60 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2af70 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2af80 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2af90 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2afa0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2afb0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2afc0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2afd0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2afe0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2aff0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2b000 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2b010 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2b020 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b030 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b040 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2b050 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2b060 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2b070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2b080 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2b090 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b0a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2b0b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b0c0 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2b0d0 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2b0e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b110 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
2b120 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b130 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
2b140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b150 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b160 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
2b170 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
2b180 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2b190 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b1a0 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
2b1b0 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
2b1c0 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
2b1d0 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
2b1e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
2b1f0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
2b200 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
2b210 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
2b220 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2b230 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b240 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
2b250 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b260 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2b270 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2b280 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b290 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2b2a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b2b0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2b2c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2b2d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b2e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b2f0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
2b300 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b310 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b320 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
2b330 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
2b340 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
2b350 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b360 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
2b370 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
2b380 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2b390 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
2b3a0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2b3b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b3c0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
2b3d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2b3e0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
2b3f0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
2b400 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b410 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2b420 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2b430 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b440 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b450 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
2b460 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
2b470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
2b480 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
2b490 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2b4a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
2b4b0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b4c0 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  le((*ppPage)->pD
2b4d0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
2b4e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b4f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2b500 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
2b510 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
2b520 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
2b530 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
2b540 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
2b550 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2b560 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
2b570 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2b580 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
2b590 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2b5a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2b5b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2b5c0 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
2b5d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
2b5e0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
2b5f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
2b600 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
2b610 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2b620 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
2b630 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
2b640 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
2b650 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
2b660 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
2b670 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
2b680 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
2b690 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2b6a0 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
2b6b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2b6c0 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
2b6d0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
2b6e0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
2b6f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2b700 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
2b710 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
2b720 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
2b730 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
2b740 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
2b750 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2b760 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
2b770 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2b780 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
2b790 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b7a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2b7b0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
2b7c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2b7d0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
2b7e0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2b7f0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
2b800 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
2b810 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
2b820 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b840 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
2b850 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
2b860 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2b890 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2b8a0 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
2b8d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2b8e0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
2b8f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b900 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2b910 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2b920 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
2b930 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
2b940 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
2b950 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
2b960 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
2b970 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
2b980 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
2b990 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
2b9a0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
2b9b0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
2b9c0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2b9d0 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
2b9e0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
2b9f0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
2ba00 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
2ba10 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2ba20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2ba30 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2ba40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2ba50 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
2ba60 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
2ba70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2ba80 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
2ba90 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2baa0 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
2bab0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
2bac0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2bad0 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
2bae0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
2baf0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
2bb00 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
2bb10 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
2bb20 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
2bb30 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
2bb40 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
2bb50 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
2bb60 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
2bb70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2bb80 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2bb90 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
2bba0 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
2bbb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bbc0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2bbd0 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
2bbe0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2bbf0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2bc00 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
2bc10 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
2bc20 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
2bc30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2bc40 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2bc50 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2bc60 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
2bc70 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2bc80 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
2bc90 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
2bca0 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
2bcb0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2bcc0 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
2bcd0 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
2bce0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2bcf0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
2bd00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2bd10 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
2bd20 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
2bd30 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
2bd40 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2bd50 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
2bd60 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
2bd70 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
2bd80 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2bd90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
2bda0 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
2bdb0 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
2bdc0 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2bdd0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
2bde0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
2bdf0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
2be00 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
2be10 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
2be20 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
2be30 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
2be40 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
2be50 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
2be60 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
2be70 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
2be80 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
2be90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2bea0 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
2beb0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
2bec0 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
2bed0 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
2bee0 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
2bef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2bf00 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
2bf10 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
2bf20 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
2bf30 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2bf40 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2bf50 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
2bf60 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2bf70 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2bf80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
2bf90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bfa0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2bfb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
2bfc0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
2bfd0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2bfe0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
2bff0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2c000 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
2c010 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
2c020 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2c030 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
2c040 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c050 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2c060 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c070 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
2c080 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
2c090 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c0a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2c0b0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2c0c0 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
2c0d0 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
2c0e0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
2c0f0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
2c100 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
2c110 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c120 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2c130 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
2c140 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
2c150 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
2c160 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2c170 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
2c180 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
2c190 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2c1a0 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
2c1b0 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
2c1c0 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
2c1d0 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
2c1e0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
2c1f0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
2c200 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
2c210 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
2c220 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
2c230 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
2c240 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2c250 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
2c260 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
2c270 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
2c280 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
2c290 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
2c2a0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2c2b0 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
2c2c0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
2c2d0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
2c2e0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
2c2f0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
2c300 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
2c310 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c320 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
2c330 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
2c340 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
2c350 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
2c360 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
2c370 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
2c380 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
2c390 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
2c3a0 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
2c3b0 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
2c3c0 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
2c3d0 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
2c3e0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
2c3f0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
2c400 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c410 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2c420 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2c430 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c450 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2c460 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
2c470 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
2c480 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2c490 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
2c4a0 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
2c4b0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
2c4c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
2c4d0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2c4e0 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
2c4f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2c500 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2c510 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2c530 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2c540 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2c550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c560 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2c570 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2c580 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2c590 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2c5a0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2c5b0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2c5c0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2c5d0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2c5e0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2c5f0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2c600 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2c610 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2c620 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2c630 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2c640 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2c650 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2c660 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2c670 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2c680 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2c690 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2c6a0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2c6b0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2c6c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2c6d0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2c6e0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2c6f0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2c700 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2c710 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2c720 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2c730 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c740 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2c750 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2c760 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c770 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2c780 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
2c790 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2c7a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2c7b0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2c7c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2c7d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c7e0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2c7f0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
2c800 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
2c810 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
2c820 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2c830 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
2c840 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2c850 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2c860 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
2c870 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
2c880 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
2c890 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
2c8a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
2c8b0 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
2c8c0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
2c8d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
2c8e0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
2c8f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2c900 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
2c910 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2c920 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2c930 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
2c940 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2c950 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2c960 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2c970 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
2c980 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
2c990 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
2c9a0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
2c9b0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
2c9c0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2c9d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c9e0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
2c9f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2ca00 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
2ca10 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
2ca20 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
2ca30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ca40 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2ca50 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2ca60 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
2ca70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2ca80 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
2ca90 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
2caa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2cab0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2cac0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2cad0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2cae0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2caf0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
2cb00 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
2cb10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cb20 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
2cb30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2cb40 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2cb50 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
2cb60 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
2cb70 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
2cb80 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  +3 > pPage->aDat
2cb90 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
2cba0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2cbb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2cbc0 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  KPT;  /* Cell ex
2cbd0 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2cbe0 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2cbf0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2cc00 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2cc10 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2cc20 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2cc30 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2cc40 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2cc50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2cc60 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2cc70 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2cc80 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2cc90 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2cca0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2ccb0 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2ccc0 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2ccd0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2cce0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2ccf0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2cd00 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2cd10 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2cd20 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2cd30 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2cd40 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2cd50 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2cd60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2cd70 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2cd80 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2cd90 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2cda0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2cdb0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2cdc0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2cdd0 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2cde0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2cdf0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2ce00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ce10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ce20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2ce30 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2ce40 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2ce50 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2ce60 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2ce70 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2ce80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ce90 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2cea0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2ceb0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2cec0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2ced0 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2cee0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2cef0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2cf00 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2cf10 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2cf20 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2cf30 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2cf40 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2cf50 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2cf60 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2cf70 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2cf80 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2cf90 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2cfa0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2cfb0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2cfc0 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2cfd0 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2cfe0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2cff0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2d000 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2d010 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2d020 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2d030 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2d040 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2d050 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2d060 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2d070 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2d080 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2d090 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2d0a0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2d0b0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2d0c0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2d0d0 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2d0e0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2d0f0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2d100 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2d110 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2d120 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2d130 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2d140 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2d150 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2d160 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2d170 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2d180 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d1a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2d1b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2d1c0 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2d1d0 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2d1e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2d1f0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2d200 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d210 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2d220 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d230 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d240 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2d250 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2d260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d270 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2d280 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2d290 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2d2a0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2d2b0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2d2c0 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2d2d0 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2d2e0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2d2f0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2d300 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2d310 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2d320 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2d330 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2d340 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2d350 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2d360 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2d370 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2d380 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2d390 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2d3a0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2d3b0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2d3c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2d3d0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2d3e0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2d3f0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2d400 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2d410 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2d420 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2d430 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2d440 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2d450 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2d460 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2d470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d480 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2d490 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d4b0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2d4c0 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2d4d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2d4e0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2d4f0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2d500 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2d510 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2d520 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2d530 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2d540 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2d550 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2d560 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2d570 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d590 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2d5a0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2d5b0 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2d5c0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d5e0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2d5f0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2d600 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2d610 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2d620 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2d630 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2d640 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2d650 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2d660 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2d670 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2d680 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2d690 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2d6a0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2d6b0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2d6c0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2d6d0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2d6e0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2d6f0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2d700 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2d710 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2d720 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2d730 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2d740 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2d750 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2d760 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2d770 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2d780 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2d790 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2d7a0 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2d7b0 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2d7c0 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2d7d0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2d7e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2d7f0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2d800 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2d810 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d820 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2d830 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2d840 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2d850 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2d860 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2d870 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2d880 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2d890 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2d8a0 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2d8b0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
2d8c0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2d8d0 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2d8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2d8f0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2d900 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2d910 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2d920 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2d930 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2d940 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2d950 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2d960 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2d970 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2d980 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2d990 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2d9a0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2d9b0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2d9c0 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2d9d0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2d9e0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2d9f0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2da00 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2da10 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2da20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2da30 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2da40 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2da50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2da60 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2da70 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2da80 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2da90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2daa0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2dab0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2dac0 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2dad0 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2dae0 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2daf0 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2db00 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2db10 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2db20 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2db30 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2db40 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2db50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2db60 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2db70 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2db80 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2db90 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2dba0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2dbb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2dbc0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2dbd0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2dbe0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2dbf0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2dc00 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2dc10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2dc20 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2dc30 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2dc40 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2dc50 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2dc60 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2dc70 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2dc80 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2dc90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2dca0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2dcb0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2dcc0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2dcd0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2dce0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2dcf0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2dd00 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2dd10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2dd20 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2dd30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2dd40 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2dd50 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2dd60 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2dd70 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2dd80 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2dd90 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2dda0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2ddb0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2ddc0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2ddd0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2dde0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2ddf0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2de00 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2de10 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2de20 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2de30 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2de40 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2de50 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2de60 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2de70 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2de80 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2de90 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2dea0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2deb0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2dec0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2ded0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2dee0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
2def0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2df00 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2df10 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2df20 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2df30 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2df40 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2df50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2df60 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2df70 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2df80 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2df90 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2dfa0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2dfb0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2dfc0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2dfd0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2dfe0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2dff0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e000 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2e010 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2e020 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2e030 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2e040 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2e050 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2e060 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2e070 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2e080 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2e090 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2e0a0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2e0b0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2e0c0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2e0d0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2e0e0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2e0f0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2e100 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2e110 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2e120 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e130 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2e140 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2e150 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2e160 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2e170 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2e180 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2e190 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2e1a0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2e1b0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2e1c0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2e1d0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2e1e0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2e1f0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2e210 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e220 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e230 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2e240 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2e250 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2e260 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e270 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2e280 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2e290 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2e2a0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2e2b0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2e2c0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2e2d0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2e2e0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2e2f0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2e300 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2e310 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2e320 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2e330 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2e340 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2e350 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2e360 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2e370 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2e380 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2e390 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2e3a0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2e3b0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2e3c0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2e3d0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2e3e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2e3f0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2e400 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e410 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2e420 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2e430 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2e440 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2e450 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2e460 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2e470 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2e480 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2e490 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2e4a0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2e4b0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2e4c0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2e4d0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2e4e0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2e4f0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2e500 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e510 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2e520 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2e530 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2e540 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2e550 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2e560 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2e570 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2e580 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2e590 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2e5a0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2e5b0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2e5c0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2e5d0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2e5e0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2e5f0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2e600 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2e610 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2e620 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2e630 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2e640 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2e650 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2e660 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2e670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2e690 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2e6a0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2e6b0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2e6c0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2e6d0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2e6e0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2e6f0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2e700 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2e710 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2e720 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2e730 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2e740 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2e750 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2e760 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2e770 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2e780 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2e790 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2e7a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e7b0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2e7c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2e7d0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2e7e0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2e7f0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2e800 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2e810 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2e820 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2e830 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2e840 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2e850 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2e860 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2e870 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2e880 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2e890 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2e8a0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2e8b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2e8c0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2e8d0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2e8e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2e8f0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2e900 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2e910 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2e920 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2e930 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2e940 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2e950 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e960 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2e970 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2e980 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2e990 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2e9a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2e9b0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2e9c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e9d0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2e9e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2e9f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ea00 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2ea10 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2ea20 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2ea30 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2ea40 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2ea50 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2ea60 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2ea70 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2ea80 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2ea90 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2eaa0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2eab0 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2eac0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2ead0 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2eae0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2eaf0 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2eb00 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2eb10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2eb20 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2eb30 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2eb40 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2eb50 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2eb60 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2eb70 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2eb80 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28  ll--;.  memmove(
2eb90 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
2eba0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
2ebb0 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  x));.  put2byte(
2ebc0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2ebd0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2ebe0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2ebf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2ec00 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2ec10 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2ec20 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2ec30 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2ec40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2ec50 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2ec60 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2ec70 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2ec80 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2ec90 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2eca0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2ecb0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2ecc0 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2ecd0 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2ece0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2ecf0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2ed00 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2ed10 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2ed20 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2ed30 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
2ed40 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2ed50 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2ed60 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2ed70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2ed80 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2ed90 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2eda0 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2edb0 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2edc0 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2edd0 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2ede0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2edf0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2ee00 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2ee10 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2ee20 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2ee30 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2ee40 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2ee50 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2ee60 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2ee70 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2ee80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2ee90 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2eea0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2eeb0 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2eec0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2eed0 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2eee0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2eef0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2ef00 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2ef10 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2ef20 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2ef30 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2ef40 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2ef50 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2ef60 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2ef70 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2ef80 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2ef90 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2efa0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2efb0 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2efc0 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2efd0 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2efe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2eff0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2f000 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2f010 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2f020 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2f030 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2f040 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2f050 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2f060 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2f070 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2f080 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2f090 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2f0a0 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2f0b0 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2f0c0 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2f0d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2f0e0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
2f0f0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2f100 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2f110 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2f120 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2f130 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2f140 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2f150 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2f160 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2f170 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2f180 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2f190 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2f1a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2f1b0 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2f1c0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2f1d0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2f1e0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2f1f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2f200 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2f210 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2f220 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2f230 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2f240 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2f250 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  page */.  int nS
2f260 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2f270 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2f280 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2f290 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2f2a0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2f2b0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2f2c0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2f2d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2f2e0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2f2f0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2f300 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2f310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f320 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2f330 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f340 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
2f350 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
2f360 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
2f370 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f380 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
2f390 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f3a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2f3b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2f3c0 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2f3d0 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2f3e0 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2f3f0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2f400 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2f410 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2f420 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2f430 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2f440 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2f450 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2f460 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2f470 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2f480 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2f490 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2f4a0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2f4b0 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2f4c0 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2f4d0 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2f4e0 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2f4f0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2f500 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2f510 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2f520 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2f530 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2f540 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2f550 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2f560 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2f570 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2f580 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2f590 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2f5a0 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2f5b0 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2f5c0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2f5d0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2f5e0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2f5f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2f600 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2f610 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2f620 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2f630 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2f640 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2f650 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2f660 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
2f670 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2f680 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
2f690 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
2f6a0 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
2f6b0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
2f6c0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
2f6d0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
2f6e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f6f0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2f700 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2f710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f720 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2f730 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2f740 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
2f750 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f760 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2f770 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
2f780 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2f790 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
2f7a0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
2f7b0 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
2f7c0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2f7d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2f7e0 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
2f7f0 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20  t + 2*i;.    rc 
2f800 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
2f810 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
2f820 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
2f830 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
2f840 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
2f850 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
2f860 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
2f870 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2f880 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a   two properties.
2f890 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
2f8a0 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a  urns success */.
2f8b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
2f8c0 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20  >= end+2 );.    
2f8d0 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
2f8e0 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
2f8f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2f900 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
2f910 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
2f920 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
2f930 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
2f940 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
2f950 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
2f960 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2f970 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2f980 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
2f990 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
2f9a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  );.    }.    mem
2f9b0 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32  move(&data[ins+2
2f9c0 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65  ], &data[ins], e
2f9d0 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74  nd-ins);.    put
2f9e0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2f9f0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2fa00 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2fa10 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2fa20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2fa30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fa40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fa50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2fa60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2fa70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2fa80 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2fa90 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2faa0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2fab0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2fac0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2fad0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2fae0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2faf0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2fb00 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2fb10 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2fb20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2fb30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2fb40 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2fb50 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2fb60 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2fb70 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2fb80 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2fb90 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2fba0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2fbb0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2fbc0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2fbd0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2fbe0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2fbf0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2fc00 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2fc10 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2fc20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2fc30 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2fc40 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2fc50 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2fc60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2fc70 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2fc80 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2fc90 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2fca0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2fcb0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2fcc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2fcd0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2fce0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2fcf0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2fd00 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2fd10 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2fd20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2fd30 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2fd40 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2fd50 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2fd60 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2fd70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2fd80 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2fd90 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2fda0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2fdb0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2fdc0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2fdd0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2fde0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2fdf0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2fe00 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2fe10 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2fe20 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2fe30 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2fe40 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2fe50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fe60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2fe70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2fe80 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2fe90 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
2fea0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2feb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2fec0 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2fed0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
2fee0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2fef0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2ff00 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2ff10 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
2ff20 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2ff30 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
2ff40 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
2ff50 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
2ff60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2ff70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2ff80 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
2ff90 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2ffa0 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2ffb0 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
2ffc0 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
2ffd0 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
2ffe0 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
2fff0 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
30000 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
30010 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
30020 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
30030 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
30040 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
30050 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
30060 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
30070 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
30080 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
30090 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
300a0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
300b0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
300c0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
300d0 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
300e0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
300f0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
30100 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
30110 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
30120 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
30130 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
30140 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
30150 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
30160 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
30170 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
30180 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
30190 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
301a0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
301b0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
301c0 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
301d0 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
301e0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
301f0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
30200 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
30210 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
30220 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
30230 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
30240 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
30250 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
30260 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
30270 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
30280 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
30290 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
302a0 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
302b0 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
302c0 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
302d0 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
302e0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
302f0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
30300 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
30310 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
30320 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
30330 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
30340 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
30350 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
30360 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
30370 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
30380 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
30390 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
303a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
303b0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
303c0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
303d0 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
303e0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
303f0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
30400 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
30410 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
30420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30430 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
30440 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
30450 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
30460 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
30470 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
30480 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
30490 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
304a0 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
304b0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
304c0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
304d0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
304e0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
304f0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
30500 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
30510 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
30520 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
30530 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
30540 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
30550 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
30560 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
30570 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
30580 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
30590 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
305a0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
305b0 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
305c0 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
305d0 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
305e0 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
305f0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
30600 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
30610 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
30620 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
30630 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
30640 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
30650 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
30660 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
30670 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
30680 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
30690 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
306a0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
306b0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
306c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
306d0 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
306e0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
306f0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
30700 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
30710 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
30720 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
30730 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
30740 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
30750 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
30760 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
30770 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
30780 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
30790 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
307a0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
307b0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
307c0 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
307d0 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
307e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
307f0 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
30800 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30810 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
30820 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
30830 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
30840 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
30850 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
30860 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
30870 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
30880 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
30890 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
308a0 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
308b0 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
308c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
308d0 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
308e0 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
308f0 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
30900 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30920 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
30930 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
30940 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30960 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30970 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
30980 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
30990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
309b0 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
309c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
309d0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
309e0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
309f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30a00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30a10 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
30a20 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
30a30 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30a40 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
30a50 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
30a60 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
30a70 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
30a80 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
30a90 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
30aa0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  >nCell==0 ) retu
30ab0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30ac0 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
30ad0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
30ae0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
30af0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
30b00 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
30b10 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
30b20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30b30 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
30b40 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
30b50 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
30b60 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
30b70 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
30b80 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
30b90 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
30ba0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
30bb0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
30bc0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
30bd0 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
30be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30bf0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
30c00 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
30c10 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
30c20 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  age->apOvfl[0];.
30c30 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
30c40 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
30c50 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
30c60 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
30c70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30c80 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30c90 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
30ca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30cb0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
30cc0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
30cd0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
30ce0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
30cf0 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
30d00 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
30d10 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
30d20 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
30d30 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
30d40 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
30d50 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
30d60 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
30d70 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
30d80 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
30d90 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
30da0 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
30db0 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
30dc0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
30dd0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
30de0 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
30df0 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
30e00 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
30e10 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
30e20 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
30e30 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
30e40 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
30e50 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
30e60 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
30e70 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
30e80 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
30e90 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
30ea0 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
30eb0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30ec0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30ed0 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
30ee0 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
30ef0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
30f00 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
30f10 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
30f20 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
30f30 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
30f40 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
30f50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
30f60 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
30f70 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
30f80 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
30f90 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
30fa0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
30fb0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
30fc0 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
30fd0 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
30fe0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
30ff0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
31000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
31010 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
31020 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
31030 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
31040 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
31050 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
31060 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
31070 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
31080 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31090 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
310a0 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
310b0 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
310c0 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
310d0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
310e0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
310f0 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
31100 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31110 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
31120 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
31130 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
31140 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
31150 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
31160 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
31170 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
31180 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
31190 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
311a0 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
311b0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
311c0 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
311d0 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
311e0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
311f0 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
31200 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
31210 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
31220 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
31230 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
31240 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
31250 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
31260 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
31270 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
31280 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
31290 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
312a0 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
312b0 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
312c0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
312d0 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
312e0 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
312f0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31300 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
31310 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
31320 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
31330 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
31340 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
31350 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
31360 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
31370 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
31380 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
31390 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
313a0 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
313b0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
313c0 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
313d0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
313e0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
313f0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
31400 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
31410 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
31420 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
31440 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
31450 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
31460 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
31470 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
31480 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
31490 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
314a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
314b0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
314c0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
314d0 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
314e0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
314f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
31500 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
31510 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31520 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
31530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
31540 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31550 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
31560 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
31570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
31580 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
31590 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
315a0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
315b0 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
315c0 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
315d0 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
315e0 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
315f0 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
31600 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
31610 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31620 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
31630 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
31640 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
31650 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
31660 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
31670 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
31680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
31690 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
316a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
316b0 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
316c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
316d0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
316e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
316f0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
31700 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
31710 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
31720 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
31730 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
31740 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
31750 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31760 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
31770 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
31780 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
31790 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
317a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
317b0 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
317c0 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
317d0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
317e0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
317f0 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
31800 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31810 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
31820 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
31830 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
31840 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
31850 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31860 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
31870 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
31880 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
31890 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
318a0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
318b0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
318c0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
318d0 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
318e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
318f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31900 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
31910 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
31920 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31930 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31940 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
31950 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31960 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
31970 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
31980 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
31990 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
319a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
319b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
319c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
319d0 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
319e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
319f0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
31a00 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
31a10 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
31a20 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
31a30 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
31a40 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
31a50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
31a60 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
31a70 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
31a80 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
31a90 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
31aa0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
31ab0 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
31ac0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
31ad0 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
31ae0 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
31af0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
31b00 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
31b10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
31b20 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
31b30 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
31b40 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
31b50 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
31b60 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
31b70 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
31b80 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
31b90 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
31ba0 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
31bb0 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f  e.** MemPage.apO
31bc0 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
31bd0 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
31be0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
31bf0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
31c00 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
31c10 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
31c20 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
31c30 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
31c40 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
31c50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
31c60 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
31c70 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
31c80 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
31c90 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
31ca0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
31cb0 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
31cc0 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
31cd0 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
31ce0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
31cf0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
31d00 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
31d10 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
31d20 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
31d30 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
31d40 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
31d50 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
31d60 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
31d70 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
31d80 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
31d90 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
31da0 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
31db0 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
31dc0 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
31dd0 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
31de0 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
31df0 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
31e00 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
31e10 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
31e20 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69   100 : 0);.    i
31e30 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69  nt rc;.    int i
31e40 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20  Data;.  .  .    
31e50 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
31e60 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73  sInit );.    ass
31e70 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65  ert( pFrom->nFre
31e80 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20  e>=iToHdr );.   
31e90 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
31ea0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
31eb0 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42  r+5]) <= (int)pB
31ec0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
31ed0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
31ee0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
31ef0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
31f00 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
31f10 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
31f20 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
31f30 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
31f40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
31f50 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
31f60 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
31f70 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
31f80 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
31f90 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
31fa0 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
31fb0 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
31fc0 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
31fd0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
31fe0 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
31ff0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
32000 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
32010 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
32020 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
32030 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
32040 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
32050 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
32060 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
32070 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
32080 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
32090 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
320a0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
320b0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
320c0 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
320d0 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
320e0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
320f0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
32100 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
32110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32120 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
32130 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
32140 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
32150 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
32160 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
32170 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
32180 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
32190 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
321a0 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
321b0 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
321c0 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
321d0 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
321e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
321f0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
32200 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
32210 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
32220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
32230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
32240 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
32250 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
32260 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
32270 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
32280 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
32290 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
322a0 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
322b0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
322c0 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
322d0 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
322e0 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
322f0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
32300 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
32310 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
32320 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
32330 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
32340 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
32350 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
32360 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
32370 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
32380 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
32390 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
323a0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
323b0 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
323c0 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
323d0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
323e0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
323f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
32400 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
32410 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
32420 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
32430 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
32440 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
32450 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
32460 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
32470 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
32480 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
32490 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
324a0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
324b0 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
324c0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
324d0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
324e0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
324f0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
32500 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
32510 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32520 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
32530 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
32540 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
32550 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
32560 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
32570 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
32580 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
32590 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
325a0 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
325b0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
325c0 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
325d0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
325e0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
325f0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
32600 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
32610 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
32620 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
32630 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
32640 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
32650 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
32660 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
32670 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
32680 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
32690 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
326a0 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
326b0 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
326c0 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
326d0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
326e0 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
326f0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
32700 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
32710 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
32720 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
32730 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
32740 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
32750 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
32760 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
32770 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
32780 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
32790 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
327a0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
327b0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
327c0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
327d0 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
327e0 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
327f0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
32800 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
32810 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
32820 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
32830 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
32840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
32850 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
32860 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
32870 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
32880 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
32890 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
328a0 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
328b0 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
328c0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
328d0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
328e0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
328f0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
32900 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
32910 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
32920 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
32930 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
32940 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
32950 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
32960 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
32970 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
32980 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
32990 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
329a0 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
329b0 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
329c0 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
329d0 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
329e0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
329f0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
32a00 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
32a10 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
32a20 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
32a30 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
32a40 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
32a50 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
32a60 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
32a70 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
32a80 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
32a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
32aa0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
32ab0 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
32ac0 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
32ad0 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
32ae0 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
32af0 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74  , off).#endif.st
32b00 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32b10 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
32b20 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
32b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32b40 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
32b50 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
32b60 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
32b70 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
32b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32b90 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
32ba0 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
32bb0 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
32bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32bd0 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
32be0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
32bf0 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
32c00 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20  .  int isRoot,  
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
32c30 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
32c40 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42  page */.  int bB
32c50 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ulk             
32c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
32c70 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e if this call i
32c80 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b  s part of a bulk
32c90 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74   load */.){.  Bt
32ca0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
32cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
32cc0 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
32cd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
32ce0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32cf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
32d00 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
32d10 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
32d20 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
32d30 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
32d40 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
32d50 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
32d60 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
32d70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32d80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
32d90 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
32da0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
32dd0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
32de0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
32df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32e00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
32e10 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
32e20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
32e30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
32e40 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
32e50 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
32e60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32e70 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
32e80 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
32e90 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
32ea0 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
32eb0 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
32ec0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
32ed0 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
32ee0 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
32ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
32f00 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
32f10 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
32f20 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
32f30 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
32f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
32f50 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
32f60 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
32f70 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
32f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32f90 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
32fa0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
32fb0 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
32fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32fd0 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
32fe0 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
32ff0 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
33000 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
33010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
33020 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
33030 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
33040 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
33050 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
33060 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
33070 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
33080 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
33090 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
330a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
330b0 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
330c0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
330d0 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
330e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
330f0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
33100 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
33110 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
33120 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
33130 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
33140 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
33150 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
33160 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
33170 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
33180 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
33190 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
331a0 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
331b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
331c0 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
331d0 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
331e0 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
331f0 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
33200 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
33210 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
33220 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
33230 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
33240 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
33250 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
33260 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
33270 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
33280 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
33290 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
332a0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
332b0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
332c0 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
332d0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
332e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
332f0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
33300 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
33310 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33330 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
33340 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
33350 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
33360 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
33370 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
33380 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
33390 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
333a0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
333b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
333c0 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
333d0 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
333e0 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
333f0 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
33400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33410 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33420 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
33430 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33440 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
33450 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
33460 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
33470 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
33480 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
33490 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
334a0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
334b0 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
334c0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
334d0 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
334e0 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
334f0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
33500 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
33510 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
33520 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
33530 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
33540 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
33550 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
33560 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
33570 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
33580 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
33590 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
335a0 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
335b0 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
335c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
335d0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
335e0 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
335f0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
33600 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
33610 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
33620 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66  | pParent->aiOvf
33630 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78  l[0]==iParentIdx
33640 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
33650 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
33660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33670 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
33680 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
33690 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
336a0 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
336b0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
336c0 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
336d0 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
336e0 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
336f0 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
33700 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
33710 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
33720 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
33730 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
33740 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
33750 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
33760 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
33770 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
33780 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
33790 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
337a0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
337b0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
337c0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
337d0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
337e0 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
337f0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
33800 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
33810 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
33820 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
33830 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
33840 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
33850 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
33860 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
33870 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
33880 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
33890 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
338a0 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
338b0 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
338c0 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
338d0 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
338e0 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
338f0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
33900 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
33910 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
33920 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
33930 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33940 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42  ( bBulk==0 || bB
33950 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  ulk==1 );.    if
33960 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
33970 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
33980 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
33990 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
339a0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
339b0 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
339c0 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20  = i-2+bBulk;.   
339d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
339e0 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29  sert( bBulk==0 )
339f0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  ;.      nxDiv = 
33a00 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
33a10 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42    }.    i = 2-bB
33a20 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  ulk;.  }.  nOld 
33a30 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b  = i+1;.  if( (i+
33a40 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
33a50 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
33a60 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
33a70 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
33a80 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
33a90 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
33aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
33ab0 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
33ac0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
33ad0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
33ae0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
33af0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
33b00 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
33b10 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
33b20 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
33b30 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  pgno, &apOld[i],
33b40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
33b50 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
33b60 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
33b70 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
33b80 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
33b90 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
33ba0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
33bb0 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
33bc0 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
33bd0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
33be0 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
33bf0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
33c00 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
33c10 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70  ->aiOvfl[0] && p
33c20 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33c30 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
33c40 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
33c50 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pOvfl[0];.      
33c60 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
33c70 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
33c80 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
33c90 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
33ca0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
33cb0 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
33cc0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
33cd0 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
33ce0 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
33cf0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
33d00 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33d10 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
33d20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
33d30 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
33d40 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
33d50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
33d60 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
33d70 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
33d80 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
33d90 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
33da0 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
33db0 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
33dc0 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
33dd0 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
33de0 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
33df0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
33e00 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
33e10 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
33e20 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
33e30 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
33e40 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
33e50 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
33e60 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
33e70 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
33e80 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
33e90 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
33ea0 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
33eb0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
33ec0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
33ed0 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
33ee0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
33ef0 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65  ut not if we are
33f00 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
33f10 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72  e mode. In secur
33f20 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20  e-delete mode,. 
33f30 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
33f40 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
33f50 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
33f60 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
33f70 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
33f80 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
33f90 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
33fa0 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
33fb0 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
33fc0 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
33fd0 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
33fe0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
33ff0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
34000 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
34010 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
34020 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
34030 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
34040 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
34050 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
34060 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  int iOff;..     
34070 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45     iOff = SQLITE
34080 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69  _PTR_TO_INT(apDi
34090 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50  v[i]) - SQLITE_P
340a0 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e  TR_TO_INT(pParen
340b0 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
340c0 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e     if( (iOff+szN
340d0 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d  ew[i])>(int)pBt-
340e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
340f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34100 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34110 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  T;.          mem
34120 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
34130 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
34140 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ge*));.         
34150 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
34160 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
34170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34180 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
34190 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b  ce[iOff], apDiv[
341a0 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
341b0 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69           apDiv[i
341c0 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  ] = &aOvflSpace[
341d0 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
341e0 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20  ->aData];.      
341f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34200 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
34210 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
34220 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
34230 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
34240 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
34250 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
34260 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
34270 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
34280 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
34290 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
342a0 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
342b0 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
342c0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
342d0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
342e0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
342f0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
34300 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
34310 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
34320 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
34330 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
34340 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
34350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34360 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
34370 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
34380 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343a0 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
343b0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
343c0 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
343d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343e0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
343f0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34420 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
34430 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
34440 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
34450 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
34460 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
34470 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
34480 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
34490 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
344a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
344b0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
344c0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
344d0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
344e0 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
344f0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
34500 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
34510 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
34520 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
34530 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
34540 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
34550 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
34560 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
34570 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
34580 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
34590 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
345a0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
345b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
345c0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
345d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
345e0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
345f0 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
34600 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
34610 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
34620 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
34630 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
34640 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
34650 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
34660 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
34670 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
34680 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
34690 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
346a0 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
346b0 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
346c0 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
346d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
346e0 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
346f0 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
34700 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
34710 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
34720 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
34730 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
34740 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
34750 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
34760 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
34770 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
34780 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
34790 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
347a0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
347b0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
347c0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
347d0 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
347e0 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
347f0 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
34800 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
34810 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
34820 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
34830 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
34840 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
34850 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
34860 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
34870 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
34880 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
34890 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
348a0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
348b0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
348c0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
348d0 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
348e0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
348f0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
34900 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
34910 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
34920 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
34930 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
34940 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
34950 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
34960 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
34970 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
34980 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
34990 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
349a0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
349b0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
349c0 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
349d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
349e0 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
349f0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
34a00 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
34a10 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
34a20 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
34a30 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
34a40 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
34a50 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
34a60 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
34a70 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
34a80 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
34a90 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
34aa0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
34ab0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
34ac0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
34ad0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
34ae0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
34af0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
34b00 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
34b10 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
34b20 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
34b30 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34b40 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
34b50 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
34b60 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
34b70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
34b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
34b90 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
34ba0 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
34bb0 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
34bc0 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
34bd0 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
34be0 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
34bf0 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
34c00 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
34c10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
34c20 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
34c30 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
34c40 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
34c50 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
34c60 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
34c70 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
34c80 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
34c90 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
34ca0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
34cb0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
34cc0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
34cd0 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
34ce0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
34cf0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
34d00 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
34d10 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
34d20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
34d30 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
34d40 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
34d50 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
34d60 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
34d70 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
34d80 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
34d90 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
34da0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
34db0 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
34dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
34dd0 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
34de0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
34df0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
34e00 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
34e10 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
34e20 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
34e30 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
34e40 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
34e50 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
34e60 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
34e70 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
34e80 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
34e90 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
34ea0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
34eb0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
34ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
34ed0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
34ee0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
34ef0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
34f00 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
34f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
34f20 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
34f30 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
34f40 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
34f50 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
34f60 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
34f70 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
34f80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
34f90 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
34fa0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
34fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
34fd0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
34fe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
34ff0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
35000 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
35010 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
35020 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
35030 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
35040 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
35050 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
35060 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35070 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
35080 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
35090 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
350a0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
350b0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
350c0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
350d0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
350e0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
350f0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
35100 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
35110 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
35120 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
35130 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
35140 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
35150 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
35160 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
35170 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
35180 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
35190 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
351a0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
351b0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
351c0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
351d0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
351e0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
351f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
35200 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
35210 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
35220 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
35230 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
35240 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
35250 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
35260 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
35270 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
35280 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
35290 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
352a0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
352b0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
352c0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
352d0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
352e0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
352f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
35300 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
35310 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
35320 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
35330 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
35340 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35350 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
35360 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
35370 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
35380 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
35390 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
353a0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
353b0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
353c0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
353d0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
353e0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
353f0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
35400 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
35410 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
35420 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
35430 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
35440 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
35450 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
35460 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
35470 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
35480 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
35490 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
354a0 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
354b0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
354c0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
354d0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
354e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
354f0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
35500 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
35510 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
35520 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
35530 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
35540 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
35550 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
35560 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
35570 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
35580 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
35590 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
355a0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
355b0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
355c0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
355d0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
355e0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
355f0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
35600 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
35610 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
35620 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
35630 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
35640 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
35650 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
35660 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
35670 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
35680 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
35690 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
356a0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
356b0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
356c0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
356d0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
356e0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
356f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
35700 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
35710 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
35720 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
35730 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35740 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
35750 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
35760 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
35770 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35780 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
35790 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
357a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
357b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
357c0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
357d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
357e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
357f0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
35800 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
35810 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
35820 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
35830 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
35840 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35850 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
35860 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
35870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
35880 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35890 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
358a0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
358b0 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
358c0 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
358d0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
358e0 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
358f0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
35900 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
35910 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
35920 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
35930 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
35940 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
35950 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
35960 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35970 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
35980 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
35990 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
359a0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
359b0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
359c0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
359d0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
359e0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
359f0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
35a00 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
35a10 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
35a20 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
35a30 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
35a40 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
35a50 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
35a60 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
35a70 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
35a80 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
35a90 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
35aa0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
35ab0 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
35ac0 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
35ad0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
35ae0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
35af0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
35b00 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
35b10 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
35b20 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
35b30 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
35b40 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
35b50 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
35b60 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
35b70 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
35b80 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
35b90 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
35ba0 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
35bb0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
35bc0 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
35bd0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
35be0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
35bf0 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
35c00 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
35c10 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
35c20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
35c30 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
35c40 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
35c50 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
35c60 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
35c70 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
35c80 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
35c90 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35ca0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
35cb0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
35cc0 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
35cd0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
35ce0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
35cf0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
35d00 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
35d10 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
35d20 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
35d30 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
35d40 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
35d50 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
35d60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35d70 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
35d80 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
35d90 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
35da0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
35db0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
35dc0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
35dd0 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
35de0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
35df0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
35e00 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
35e10 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
35e20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
35e30 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
35e40 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
35e50 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
35e60 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
35e70 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
35e80 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
35e90 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
35ea0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
35eb0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
35ec0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
35ed0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
35ee0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
35ef0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
35f00 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
35f10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35f30 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
35f40 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
35f50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
35f60 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
35f70 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
35f80 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
35f90 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
35fa0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
35fb0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
35fc0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
35fd0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
35fe0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
35ff0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
36000 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
36010 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
36020 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
36030 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
36040 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
36050 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
36060 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
36070 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
36080 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
36090 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
360a0 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
360b0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
360c0 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
360d0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
360e0 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
360f0 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
36100 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
36110 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
36120 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
36130 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
36140 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
36150 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
36160 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
36170 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
36180 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
36190 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
361a0 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
361b0 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
361c0 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
361d0 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
361e0 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
361f0 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
36200 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
36210 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
36220 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
36230 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
36240 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
36250 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
36260 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
36270 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
36280 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
36290 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
362a0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
362b0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
362c0 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
362d0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
362e0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
362f0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
36300 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
36310 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
36320 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
36330 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
36340 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
36350 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
36360 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
36370 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
36380 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
36390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
363a0 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
363b0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
363c0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
363d0 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
363e0 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
363f0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
36400 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
36410 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
36420 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
36430 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
36440 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36450 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
36460 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
36470 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
36480 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
36490 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
364a0 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
364b0 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
364c0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
364d0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
364e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
364f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
36500 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
36510 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
36520 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
36530 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
36540 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
36550 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
36560 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
36570 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
36580 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
36590 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
365a0 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
365b0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
365c0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
365d0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
365e0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
365f0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
36600 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
36610 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
36620 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
36630 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
36640 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
36650 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
36660 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
36670 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
36680 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
36690 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
366a0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
366b0 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
366c0 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
366d0 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
366e0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
366f0 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
36700 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
36710 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
36720 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
36730 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
36740 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
36750 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
36760 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
36770 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
36780 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
36790 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
367a0 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
367b0 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
367c0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
367d0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
367e0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
367f0 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
36800 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36810 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
36820 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
36830 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
36840 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
36850 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
36860 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
36870 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
36880 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
36890 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
368a0 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
368b0 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
368c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
368d0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
368e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
368f0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
36900 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
36910 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
36920 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
36930 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
36940 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
36950 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
36960 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
36970 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
36980 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
36990 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
369a0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
369b0 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
369c0 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
369d0 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
369e0 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
369f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36a00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
36a10 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
36a20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
36a30 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
36a40 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
36a50 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
36a60 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
36a70 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
36a80 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
36a90 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
36aa0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
36ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36ac0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
36ad0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
36ae0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
36af0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
36b00 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
36b10 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
36b20 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
36b30 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
36b40 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
36b50 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
36b60 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
36b70 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
36b80 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
36b90 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
36ba0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
36bb0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
36bc0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
36bd0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
36be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
36bf0 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
36c00 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
36c10 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
36c20 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
36c30 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
36c40 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
36c50 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
36c60 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
36c70 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
36c80 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
36c90 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
36ca0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
36cb0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
36cc0 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
36cd0 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
36ce0 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
36cf0 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
36d00 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
36d10 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
36d20 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
36d30 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
36d40 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
36d50 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
36d60 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
36d70 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
36d80 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
36d90 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
36da0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
36db0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36dc0 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
36dd0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
36de0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
36df0 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
36e00 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
36e10 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74  pace <= (int)pBt
36e20 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
36e30 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
36e40 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
36e50 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
36e60 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
36e70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
36e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
36e90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36ea0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
36eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36ec0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
36ed0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
36ee0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
36ef0 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
36f00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
36f10 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
36f20 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
36f30 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
36f40 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
36f50 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
36f60 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
36f70 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
36f80 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
36f90 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
36fa0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
36fb0 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
36fc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
36fd0 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
36fe0 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
36ff0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
37000 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
37010 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
37020 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37030 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
37040 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
37050 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
37060 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
37070 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
37080 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
37090 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
370a0 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
370b0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
370c0 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
370d0 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
370e0 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
370f0 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
37100 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
37110 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
37120 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
37130 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
37140 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
37150 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
37160 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
37170 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
37180 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
37190 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
371a0 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
371b0 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
371c0 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
371d0 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
371e0 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
371f0 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
37200 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
37210 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
37220 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
37230 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
37240 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
37250 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
37260 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
37270 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
37280 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
37290 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
372a0 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
372b0 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
372c0 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
372d0 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
372e0 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
372f0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
37300 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37310 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
37320 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
37330 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
37340 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
37350 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
37360 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
37370 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
37380 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
37390 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
373a0 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
373b0 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
373c0 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
373d0 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
373e0 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
373f0 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
37400 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
37410 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
37420 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
37430 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
37440 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
37450 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
37460 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
37470 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
37480 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
37490 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
374a0 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
374b0 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
374c0 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
374d0 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
374e0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
374f0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
37500 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
37510 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
37520 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
37530 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
37540 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
37550 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
37560 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
37570 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
37580 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
37590 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
375a0 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
375b0 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
375c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
375d0 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
375e0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
375f0 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
37600 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
37610 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
37620 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
37630 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
37640 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
37650 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
37660 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
37670 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
37680 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
37690 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
376a0 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
376b0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
376c0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
376d0 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
376e0 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
376f0 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
37700 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
37710 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
37720 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
37730 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
37740 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
37750 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
37760 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
37770 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
37780 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
37790 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
377a0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
377b0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
377c0 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
377d0 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
377e0 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
377f0 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
37800 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
37810 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37820 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
37830 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37840 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
37850 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
37860 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
37870 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
37880 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
37890 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
378a0 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
378b0 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
378c0 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
378d0 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
378e0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
378f0 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
37900 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
37910 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37920 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
37930 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37940 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
37950 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
37960 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
37970 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
37980 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
37990 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
379a0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
379b0 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
379c0 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
379d0 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
379e0 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
379f0 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
37a00 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
37a10 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
37a20 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
37a30 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
37a40 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
37a50 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
37a60 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
37a70 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
37a80 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
37a90 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
37aa0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
37ab0 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
37ac0 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
37ad0 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
37ae0 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
37af0 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
37b00 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
37b10 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
37b20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
37b30 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
37b40 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
37b50 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
37b60 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
37b70 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
37b80 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
37b90 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
37ba0 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
37bb0 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d  d->aiOvfl[0] : -
37bc0 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
37bf0 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
37c00 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
37c10 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
37c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c30 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
37c40 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
37c50 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
37c60 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
37c70 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
37c80 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
37c90 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
37ca0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
37cb0 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
37cc0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
37cd0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
37ce0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
37cf0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
37d00 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
37d10 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
37d20 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
37d30 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
37d40 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
37d50 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
37d60 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
37d70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
37d80 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
37d90 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
37da0 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
37db0 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20  nOld );.        
37dc0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
37dd0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
37de0 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
37df0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
37e00 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
37e10 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66  flow;.        if
37e20 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pOld->nOverflo
37e30 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  w ){.          n
37e40 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
37e50 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
37e60 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20        iOverflow 
37e70 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
37e80 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  + pOld->aiOvfl[0
37e90 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
37ea0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
37eb0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
37ec0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
37ed0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
37ee0 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
37ef0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
37f00 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
37f10 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70  ld->aiOvfl[0]==p
37f20 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31  Old->aiOvfl[1]-1
37f30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37f40 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
37f50 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d  Old->aiOvfl[1]==
37f60 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d  pOld->aiOvfl[2]-
37f70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  1);.      if( i=
37f80 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  =iOverflow ){.  
37f90 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
37fa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
37fb0 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30   (--nOverflow)>0
37fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
37fd0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20  verflow++;.     
37fe0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
37ff0 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65      if( i==cntNe
38000 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  w[k] ){.        
38010 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
38020 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
38030 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
38040 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77  last cell on new
38050 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
38060 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74  ing page k. If t
38070 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
38080 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
38090 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
380a0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
380b0 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20  hen cell i is a 
380c0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a  divider cell.  *
380d0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
380e0 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20   apNew[++k];.   
380f0 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61       if( !leafDa
38100 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ta ) continue;. 
38110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
38120 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20  ert( j<nOld );. 
38130 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
38140 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  New );..      /*
38150 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   If the cell was
38160 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69   originally divi
38170 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73  der cell (and is
38180 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20   not now) or.   
38190 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f     ** an overflo
381a0 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68  w cell, or if th
381b0 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74  e cell was locat
381c0 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ed on a differen
381d0 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20  t sibling.      
381e0 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74  ** page before t
381f0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
38200 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  en the pointer m
38210 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ap entries assoc
38220 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77  iated.      ** w
38230 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72  ith any child or
38240 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
38250 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
38260 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
38270 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70  ( isDivider || p
38280 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  Old->pgno!=pNew-
38290 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
382a0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
382b0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
382c0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
382d0 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c   get4byte(apCell
382e0 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [i]), PTRMAP_BTR
382f0 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  EE, pNew->pgno, 
38300 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
38310 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
38320 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  ll[i]>pNew->minL
38330 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
38340 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
38350 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
38360 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  i], &rc);.      
38370 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
38380 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66  }..    if( !leaf
38390 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
383a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
383b0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  New; i++){.     
383c0 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74     u32 key = get
383d0 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d  4byte(&apNew[i]-
383e0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
383f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
38400 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42  t, key, PTRMAP_B
38410 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e  TREE, apNew[i]->
38420 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
38430 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30    }.    }..#if 0
38440 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d  .    /* The ptrm
38450 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63  apCheckPages() c
38460 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29  ontains assert()
38470 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
38480 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20